reentrantlock用于替代synchronized(3)

                       reentrantlock用于替代synchronized(3)
package com.qqjx.thread;

/*
 * reentrantlock用于替代synchronized
 * 由于m1锁定this,只有m1执行完毕的时候,m2才能执行
 * 这里是复习synchronized最原始的语义
 *
 * 使用reentrantlock可以完成同样的功能
 * 需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)
 * 使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放
 *
 * 使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待
 *
 * 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,
 * 在一个线程等待锁的过程中,可以被打断
 * @Auther  wangpeng
 * @Date 2021/1/15
* */

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class T04_ReentrantLock4 {
    
    
    public static void main(String[] args) {
    
    
        Lock lock = new ReentrantLock();


        Thread t1 = new Thread(()->{
    
    
            try {
    
    
                lock.lock();
                System.out.println("t1 start");
                TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
                System.out.println("t1 end");
            } catch (InterruptedException e) {
    
    
                System.out.println("interrupted!");
            } finally {
    
    
                lock.unlock();
            }
        });
        t1.start();

        Thread t2 = new Thread(()->{
    
    
            try {
    
    
                //lock.lock();
                lock.lockInterruptibly(); //可以对interrupt()方法做出响应
                System.out.println("t2 start");
                TimeUnit.SECONDS.sleep(5);
                System.out.println("t2 end");
            } catch (InterruptedException e) {
    
    
                System.out.println("interrupted!");
            } finally {
    
    
                lock.unlock();
            }
        });
        t2.start();

        try {
    
    
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        t2.interrupt(); //打断线程2的等待

    }

}

t1 start
interrupted!
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
	at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
	at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
	at com.qqjx.thread.T04_ReentrantLock4.lambda$main$1(T04_ReentrantLock4.java:53)
	at java.lang.Thread.run(Thread.java:748)

猜你喜欢

转载自blog.csdn.net/m0_52936310/article/details/112646661