package lock; import java.util.concurrent.locks.ReentrantLock; /** * * @Description: 实现了等待锁的时候,5秒没有获取到锁,中断等待,线程继续做其它事情。 * 参考:http://hi.baidu.com/cyberniuniu/item/7fdba2fbe9373b733d198b34 * @author thrillerzw * @version 1.0 * @create time 2014-4-25 下午1:38:17 * 输出: * 开始往这个buff写入数据… 不等了,尝试中断 我不读了 读结束 */ public class ReentrantLockTest { public static void main(String[] args) throws InterruptedException { BufferInterruptibly buff = new BufferInterruptibly(); final Writer writer = new Writer(buff); final Reader reader = new Reader(buff); writer.start(); Thread.sleep(1000); reader.start(); new Thread(new Runnable() { @Override public void run() { long start = System.currentTimeMillis(); for (;;) { if (System.currentTimeMillis() - start > 10000) { System.out.println("不等了,尝试中断"); reader.interrupt(); break; } } } }).start(); } public static class BufferInterruptibly { private ReentrantLock lock = new ReentrantLock(); public void write() { lock.lock(); try { long startTime = System.currentTimeMillis(); System.out.println("开始往这个buff写入数据…"); for (;;)// 模拟要处理很长时间 { if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE) break; } System.out.println("终于写完了"); } finally { lock.unlock(); } } public void read() throws InterruptedException { lock.lockInterruptibly();//注意这里,可以响应中断,抛出中断异常。 try { System.out.println("从这个buff读数据"); } finally { lock.unlock(); } } } public static class Writer extends Thread { private BufferInterruptibly buff; public Writer(BufferInterruptibly buff) { this.buff = buff; } @Override public void run() { buff.write(); System.out.println("写结束"); } } public static class Reader extends Thread { private BufferInterruptibly buff; public Reader(BufferInterruptibly buff) { this.buff = buff; } @Override public void run() { try { buff.read();//可以收到中断的异常,从而有效退出 } catch (InterruptedException e) { System.out.println("我不读了"); } System.out.println("读结束,去做其它事情"); } } }
2、synchronized + 对象锁
/** * * @Description: 不能实现 等待锁的时候,5秒没有获取到锁,中断等待,线程继续做其它事情。 * 参考:http://hi.baidu.com/cyberniuniu/item/7fdba2fbe9373b733d198b34 * @author thrillerzw * @version 1.0 * @create time 2014-4-25 下午12:52:02 * 输出: * 开始往这个buff写入数据… 不等了,尝试中断 中断结束 */ public class synchronizedTest { public static void main(String[] args) throws InterruptedException { Buffer buff = new Buffer(); final Writer writer = new Writer(buff); final Reader reader = new Reader(buff); writer.start(); Thread.sleep(1000); reader.start(); new Thread(new Runnable() { @Override public void run() { long start = System.currentTimeMillis(); for (;;) { //等5秒钟去中断读 if (System.currentTimeMillis() - start > 5000) { System.out.println("不等了,尝试中断"); reader.interrupt(); break; } } System.out.println("中断结束"); } }).start(); } public static class Writer extends Thread { private Buffer buff; public Writer(Buffer buff) { this.buff = buff; } @Override public void run() { buff.write(); System.out.println("写结束"); } } public static class Reader extends Thread { private Buffer buff; public Reader(Buffer buff) { this.buff = buff; } @Override public void run() { buff.read();//一直阻塞 System.out.println("读结束"); } } public static class Buffer { private Object lock; public Buffer() { lock = this; } public void write() { synchronized (lock) { long startTime = System.currentTimeMillis(); System.out.println("开始往这个buff写入数据…"); for (;;)// 模拟要处理很长时间 { if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE) break; } System.out.println("终于写完了"); } } public void read() { synchronized (lock) { //一直阻塞 System.out.println("从这个buff读数据"); } } } }
3、Memcached-Java-Client SockIOPool 初始化用到了 ReentrantLock 可重入同步锁
//locks
private final ReentrantLock initDeadLock = new ReentrantLock();
/**
* schoonerSockIOPool.initialize();
* Initializes the pool.
*/
public void initialize() {
//加锁
initDeadLock.lock();
try {
// if servers is not set, or it empty, then
// throw a runtime exception
if (servers == null || servers.length <= 0) {
log.error("++++ trying to initialize with no servers");
throw new IllegalStateException("++++ trying to initialize with no servers");
}
// pools
socketPool = new HashMap<String, GenericObjectPool>(servers.length);
//并发map
hostDead = new ConcurrentHashMap<String, Date>();
hostDeadDur = new ConcurrentHashMap<String, Long>();
// only create up to maxCreate connections at once
// initalize our internal hashing structures
if (this.hashingAlg == CONSISTENT_HASH)
populateConsistentBuckets();
else
populateBuckets();
// mark pool as initialized
this.initialized = true;
} finally {
//finally中释放锁
initDeadLock.unlock();
}
}