java-线程同步-Lock

dsysama

关注

阅读 85

2022-03-18

Lock: 接口

ReentrantLock类实现了Lock,常用实现类

构造器分为有参数和无参数,有参数的如果传入true,说明线程是公平的,先到先进,不会出现一个线程刚进入再次进入的现象,传入false则没有上述功能。

1.实例化ReentrantLock

2.调用lock(),必须紧跟在try后面

3.调用unlock()

public class LockTest {
    public static void main(String[] args) {
        Window window = new Window();
        Thread t1 = new Thread(window);
        Thread t2 = new Thread(window);
        Thread t3 = new Thread(window);

        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");

        t1.start();
        t2.start();
        t3.start();
    }
}
class Window implements Runnable{
    private static int ticket = 100;
    //1
    private ReentrantLock lock = new ReentrantLock(true);

    @Override
    public void run() {
        while(true){
            try {
                //2
                lock.lock();
                if(ticket > 0){
                    System.out.println(Thread.currentThread().getName() + "售出票号为:" + ticket);
                    ticket--;
                }else{
                    break;
                }
            } finally {
                //3
                lock.unlock();
            }
        }
    }
}

synchronized与Lock的异同?

同:两者都是为解决线程安全问题

异:synchronized机制在执行完相应的同步代码块后,自动释放同步监视器

Lock需要手动启动同步和结束同步。建议使用Lock->同步代码块->同步方法

精彩评论(0)

0 0 举报