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(); } }
相关推荐
2. **中断支持**:ReentrantLock支持可中断的获取锁,而synchronized不支持。 3. **公平性**:ReentrantLock可配置为公平锁,而synchronized总是非公平的。 4. **锁绑定条件**:ReentrantLock可以通过newCondition()...
总结来说,ReentrantLock在Java多线程编程中扮演着关键角色,提供了灵活的锁管理机制,包括公平性和非公平性选择,以及可中断和定时的锁获取方式。了解和熟练掌握ReentrantLock的使用,能够帮助开发者编写出高效、...
- **可中断锁等待**:与`synchronized`不同,`ReentrantLock`的`lockInterruptibly()`方法使线程在等待时能够响应中断,提高程序的响应性。 - **锁投票**:`ReentrantLock`允许线程查询锁的状态,如`isLocked()`和`...
悲观锁是一种假设所有的线程都会竞争锁的机制,它可以确保线程安全,但是它也可能会导致线程阻塞和饥饿。乐观锁是一种假设大部分线程不会竞争锁的机制,它可以提高程序的执行效率,但是它也可能会导致线程安全问题。...
- **AQS简介**:AQS是实现锁和同步器的抽象基础类,它通过维护一个FIFO等待队列和一个整型状态字段state来管理锁的获取和释放。很多并发工具类,如ReentrantLock、Semaphore等,都是基于AQS构建的。 - **等待队列...
ReentrantLock是一种重入锁,实现了Lock接口,能够对共享资源重复加锁,即当前线程获取该锁再次获取不会被阻塞。ReentrantLock的可重入性是通过继承AQS(AbstractQueuedSynchronizer)实现的。 ReentrantLock的主要...
- `lock()`:无条件地尝试获取锁,如果锁已被其他线程占用,则当前线程会阻塞直至获得锁。 - `lockInterruptibly()`:与`lock()`类似,但支持响应中断。即在等待锁的过程中,如果当前线程被中断,那么会抛出...
Java中的ReentrantLock是线程安全编程中的一种高级锁机制,它属于Lock接口的一个实现,提供了比synchronized更丰富的功能和更高的灵活性。ReentrantLock的名字来源于它的可重入性,这意味着一个线程可以多次获取同一...
7. **可中断的等待**:与synchronized不同,使用ReentrantLock的线程可以在等待锁时被中断,通过调用Condition的await()方法进入等待状态,当其他线程调用signal()方法或线程被中断时,等待的线程会被唤醒。...
ReentrantLock实现了Lock接口,具备公平锁与非公平锁两种模式,同时支持中断等待和超时等待,极大地提升了并发控制的灵活性和效率。 1. **内部实现** ReentrantLock的实现基于AbstractQueuedSynchronizer(AQS),...
`ReentrantLock`是Java并发编程中非常重要的一种锁,它提供了比`...通过对`ReentrantLock`的深入理解,开发者可以更好地设计和实现高效的并发程序,灵活地控制锁的获取和释放,以及处理线程的中断和同步问题。
1. **尝试获取锁**:`ReentrantLock`提供了一个`tryLock()`方法,允许线程尝试获取锁,如果获取失败,不会立即阻塞,而是立即返回结果。 2. **响应中断**:持有锁的线程在调用`await()`方法后可以被中断,并且在...
Java并发编程中的显示锁,即ReentrantLock,是Java 5.0引入的重要特性,它为多线程环境提供了更为灵活的控制。ReentrantLock是一个可重入的锁,这意味着一个线程可以多次获取同一锁,这与synchronized内置锁的行为...
2. **可中断锁**:与内置锁不同,`ReentrantLock`支持中断等待锁的线程。如果线程在等待锁时被中断,它会抛出`InterruptedException`,这在某些场景下非常有用。`ReentrantLockInterruptDemo.java`可能展示了这个...
ReentrantLock更灵活,提供了公平锁和非公平锁的选择,以及可中断和可超时的锁获取;volatile解决了变量在多线程环境中的可见性问题;Atomic类提供了高效且无锁的并发解决方案。在实际编程中,开发者应根据具体场景...
当一个线程进入同步代码块或方法时,会获取到对应的监视器锁,其他试图进入的线程将会被阻塞,直到该线程执行完毕并释放锁。`synchronized`具有以下特点: 1. 自动管理:无需手动获取和释放锁,由JVM自动进行,降低...
比如,当需要更细粒度的控制锁,或者需要在释放锁后执行某些操作,或者在等待锁时能够中断或超时,ReentrantLock都能提供解决方案。但是,需要注意的是,虽然ReentrantLock提供了更多的控制,但同时也增加了代码的...
然而,实际的Java ReentrantLock类还包含了更多的优化,如条件变量、定时锁等待、锁中断等特性,这些在实现时需要额外考虑。 在提供的测试例子中,我们可以模拟多线程环境,观察自定义可重入锁在并发情况下的行为,...
典型的Lock实现如ReentrantLock,它支持公平锁和非公平锁,以及可重入和可中断的特性。 五、ReadWriteLock接口的设计与实现 ReadWriteLock接口代表读写锁,它允许多个读取者同时访问资源,但在写入时确保互斥。典型...
这意味着当一个线程阻塞(如等待I/O操作)时,程序需要决定哪个线程应该获得CPU资源。在单个CPU上,这通常意味着在可运行的线程之间切换。在多核系统中,每个核心可以并发地运行不同线程,进一步提高了并行性。 在...