java基础-线程同步Lock锁

线程同步

Lock锁:虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,jdk5后提供了一个新的锁对象Lock

Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作

Lock中提供了获得锁和释放锁的方法

void lock():获得锁

void unlock():释放锁

Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化

ReentrantLock的构造方法 ReentrantLock()可以创建一个ReentrantLock的实例

public class LockDemo implements Runnable {

​    private int tickets =100;

​    private Lock lock = new ReentrantLock();

​    public void run() {

​        while (true){

​            //try catch防止 操作数据代码块出错走不到 释放锁

​            try{

​                //把多条语句操作数据的代码加锁

​                lock.lock();

​                if(tickets >0){

​                    try {

​                        Thread.*sleep*(1000);

​                    } catch (InterruptedException e) {

​                        e.printStackTrace();

​                    }

​                    System.*out*.println(Thread.*currentThread*().getName()+"正在售出第"+tickets+"张票");

​                    tickets--;

​                }

​            }finally {

​                lock.unlock();

​            }

​        }

​    }

}
//测试类
class test03 {

​    public static void main(String[] args) {

​        LockDemo lockDemo = new LockDemo();

​        Thread t1 = new Thread(lockDemo, "窗口1");

​        Thread t2 = new Thread(lockDemo, "窗口2");

​        Thread t3 = new Thread(lockDemo, "窗口3");

​        t1.start();

​        t2.start();

​        t3.start();

​    }

}
posted @ 2021-08-18 11:38  只要不兔的学习笔记  阅读(83)  评论(0)    收藏  举报