代码是:
package com.eyu.gift.lock;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.LockSupport;
class FailLock {
Queue<Thread> queue = new ConcurrentLinkedQueue<Thread>();
public void lock() {
queue.add(Thread.currentThread());
if (queue.peek() != Thread.currentThread()) {
LockSupport.park(this);
}
}
public void unlock() {
queue.remove();
LockSupport.unpark(queue.peek());
}
}
测试代码:
package com.eyu.gift.lock;
import java.util.concurrent.CountDownLatch;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
public class FailLockTest {
public static final int NUM = 5000;
public static final int THREAD_NUM = 40;
static int[] target = new int[THREAD_NUM];
@Test
public void test() throws Exception {
final FailLock failLock = new FailLock();
final CountDownLatch endCountDownLatch = new CountDownLatch(THREAD_NUM);
final CountDownLatch startCountDownLatch = new CountDownLatch(1);
for (int j = 0; j < THREAD_NUM; j++) {
final int thread = j;
Thread t = new Thread() {
@Override
public void run() {
try {
startCountDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < NUM; i++) {
failLock.lock();
++target[thread];
// System.err.println(target[thread] + " ======== " + Thread.currentThread().getName());
failLock.unlock();
}
endCountDownLatch.countDown();
}
};
t.setName("线程" + thread);
t.start();
}
startCountDownLatch.countDown();
endCountDownLatch.await();
int total = 0;
for (int i = 0; i < THREAD_NUM; i++) {
total += target[i];
}
Assert.assertThat(total, Matchers.is(THREAD_NUM * NUM));
}
}
分享到:
相关推荐
redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现 redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现
主要介绍了java 线程公平锁与非公平锁详解及实例代码的相关资料,需要的朋友可以参考下
利用java实现简易计算器,java源代码,利用java实现简易计算器
主要介绍了Java基于redis实现分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java实现的一个简单生命游戏java实现的一个简单生命游戏java实现的一个简单生命游戏 java实现的一个简单生命游戏java实现的一个简单生命游戏java实现的一个简单生命游戏 java实现的一个简单生命游戏java实现的一个...
Java 中的悲观锁和乐观锁的实现 纯开发技巧。
关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java...
这是一个用java实现的简易的编译器,他能将一个具有加法和乘法的算术表达式编译成类汇编语言,这是我博文对应的代码,具体请参看我的博文: http://blog.csdn.net/tyler_download/article/details/50668983 例如...
java实现oracle分页策略完整版,可当做参考类使用,有详细注释,适合初学者。
这是一个基于JAVA的策略设计模式。松耦合,可扩展
Java GUI 实现的策略游戏——蜜蜂王国.zip Java GUI 实现的策略游戏——蜜蜂王国.zip Java GUI 实现的策略游戏——蜜蜂王国.zip Java GUI 实现的策略游戏——蜜蜂王国.zip Java GUI 实现的策略游戏——蜜蜂王国.zip ...
java实现直播系统,有主播界面,围观界面,可以相互切换,登录权限
java实现一个简单的植物大战僵尸游戏.zip java实现一个简单的植物大战僵尸游戏.zip java实现一个简单的植物大战僵尸游戏.zip java实现一个简单的植物大战僵尸游戏.zip java实现一个简单的植物大战僵尸游戏.zip java...
今天小编就为大家分享一篇关于Java线程公平锁和非公平锁的差异讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
java 实现一个录音机 java 实现一个录音机 java 实现一个录音机
一个java编写的简易计算器源码 老师布置的作业,实现简单的加减乘除
用信号量解决不死锁的哲学家问题 java实现
用java实现的一个简易浏览器。教你如何在自己的程序中显示网页上的内容。
一个自己用JAVA实现的ARMA模型,可以运行。实现比较简单,希望对大家有用。