`
thrillerzw
  • 浏览: 143745 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ReentrantLock锁实现中断线程阻塞

 
阅读更多
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();
  }
 }

 

分享到:
评论

相关推荐

    Java 多线程与并发(11-26)-JUC锁- ReentrantLock详解.pdf

    2. **中断支持**:ReentrantLock支持可中断的获取锁,而synchronized不支持。 3. **公平性**:ReentrantLock可配置为公平锁,而synchronized总是非公平的。 4. **锁绑定条件**:ReentrantLock可以通过newCondition()...

    Java多线程ReentrantLock1

    总结来说,ReentrantLock在Java多线程编程中扮演着关键角色,提供了灵活的锁管理机制,包括公平性和非公平性选择,以及可中断和定时的锁获取方式。了解和熟练掌握ReentrantLock的使用,能够帮助开发者编写出高效、...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    - **可中断锁等待**:与`synchronized`不同,`ReentrantLock`的`lockInterruptibly()`方法使线程在等待时能够响应中断,提高程序的响应性。 - **锁投票**:`ReentrantLock`允许线程查询锁的状态,如`isLocked()`和`...

    java多线程之并发锁

    悲观锁是一种假设所有的线程都会竞争锁的机制,它可以确保线程安全,但是它也可能会导致线程阻塞和饥饿。乐观锁是一种假设大部分线程不会竞争锁的机制,它可以提高程序的执行效率,但是它也可能会导致线程安全问题。...

    ReentrantLock实现原理详解

    - **AQS简介**:AQS是实现锁和同步器的抽象基础类,它通过维护一个FIFO等待队列和一个整型状态字段state来管理锁的获取和释放。很多并发工具类,如ReentrantLock、Semaphore等,都是基于AQS构建的。 - **等待队列...

    ReentrantLock源码详解--公平锁、非公平锁

    ReentrantLock是一种重入锁,实现了Lock接口,能够对共享资源重复加锁,即当前线程获取该锁再次获取不会被阻塞。ReentrantLock的可重入性是通过继承AQS(AbstractQueuedSynchronizer)实现的。 ReentrantLock的主要...

    ReentrantLock源码分析

    - `lock()`:无条件地尝试获取锁,如果锁已被其他线程占用,则当前线程会阻塞直至获得锁。 - `lockInterruptibly()`:与`lock()`类似,但支持响应中断。即在等待锁的过程中,如果当前线程被中断,那么会抛出...

    Java中ReentrantLock的使用.docx

    Java中的ReentrantLock是线程安全编程中的一种高级锁机制,它属于Lock接口的一个实现,提供了比synchronized更丰富的功能和更高的灵活性。ReentrantLock的名字来源于它的可重入性,这意味着一个线程可以多次获取同一...

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    7. **可中断的等待**:与synchronized不同,使用ReentrantLock的线程可以在等待锁时被中断,通过调用Condition的await()方法进入等待状态,当其他线程调用signal()方法或线程被中断时,等待的线程会被唤醒。...

    ReentrantLock流程浅析

    ReentrantLock实现了Lock接口,具备公平锁与非公平锁两种模式,同时支持中断等待和超时等待,极大地提升了并发控制的灵活性和效率。 1. **内部实现** ReentrantLock的实现基于AbstractQueuedSynchronizer(AQS),...

    ReentrantLock代码剖析之ReentrantLock_lock

    `ReentrantLock`是Java并发编程中非常重要的一种锁,它提供了比`...通过对`ReentrantLock`的深入理解,开发者可以更好地设计和实现高效的并发程序,灵活地控制锁的获取和释放,以及处理线程的中断和同步问题。

    java多线程系列(四)ReentrantLock的使用.docx

    1. **尝试获取锁**:`ReentrantLock`提供了一个`tryLock()`方法,允许线程尝试获取锁,如果获取失败,不会立即阻塞,而是立即返回结果。 2. **响应中断**:持有锁的线程在调用`await()`方法后可以被中断,并且在...

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    Java并发编程中的显示锁,即ReentrantLock,是Java 5.0引入的重要特性,它为多线程环境提供了更为灵活的控制。ReentrantLock是一个可重入的锁,这意味着一个线程可以多次获取同一锁,这与synchronized内置锁的行为...

    Java多线程高并发篇(一)--重入锁

    2. **可中断锁**:与内置锁不同,`ReentrantLock`支持中断等待锁的线程。如果线程在等待锁时被中断,它会抛出`InterruptedException`,这在某些场景下非常有用。`ReentrantLockInterruptDemo.java`可能展示了这个...

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    ReentrantLock更灵活,提供了公平锁和非公平锁的选择,以及可中断和可超时的锁获取;volatile解决了变量在多线程环境中的可见性问题;Atomic类提供了高效且无锁的并发解决方案。在实际编程中,开发者应根据具体场景...

    ReentrantLock与synchronized

    当一个线程进入同步代码块或方法时,会获取到对应的监视器锁,其他试图进入的线程将会被阻塞,直到该线程执行完毕并释放锁。`synchronized`具有以下特点: 1. 自动管理:无需手动获取和释放锁,由JVM自动进行,降低...

    locks框架_ReentrantLock.pdf

    比如,当需要更细粒度的控制锁,或者需要在释放锁后执行某些操作,或者在等待锁时能够中断或超时,ReentrantLock都能提供解决方案。但是,需要注意的是,虽然ReentrantLock提供了更多的控制,但同时也增加了代码的...

    自己动手写一把可重入锁测试案例

    然而,实际的Java ReentrantLock类还包含了更多的优化,如条件变量、定时锁等待、锁中断等特性,这些在实现时需要额外考虑。 在提供的测试例子中,我们可以模拟多线程环境,观察自定义可重入锁在并发情况下的行为,...

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    典型的Lock实现如ReentrantLock,它支持公平锁和非公平锁,以及可重入和可中断的特性。 五、ReadWriteLock接口的设计与实现 ReadWriteLock接口代表读写锁,它允许多个读取者同时访问资源,但在写入时确保互斥。典型...

    理解多线程,写一个多线程应用程序,要求能在用户级实现线程的调度,如启动、挂起、恢复、停止,的C thread、java thread实现。

    这意味着当一个线程阻塞(如等待I/O操作)时,程序需要决定哪个线程应该获得CPU资源。在单个CPU上,这通常意味着在可运行的线程之间切换。在多核系统中,每个核心可以并发地运行不同线程,进一步提高了并行性。 在...

Global site tag (gtag.js) - Google Analytics