package lock;
/*
方式三:
Lock锁
synchronized和lock的不同
1.sychronized在执行完相应代码块以后属于自动释放同步监视器,lock需要手动启动同步
建议优先使用lock->同步方法块->同步方法(在方法体之外)
实现Runnable对象被三个线程调用,然后这个对象的run方法里贡献资源操作器被lock上锁了
@author zsben
@create 2020-01-03 23:55
*/
import java.util.concurrent.locks.ReentrantLock;
class Window implements Runnable{
private int ticket = 100;
//1.实例化lock
private ReentrantLock lock = new ReentrantLock(true);//fair=true:公平锁,线程先来后到
@Override
public void run() {
while(true){
try{
//2.调用lock方法
lock.lock();
if(ticket>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+": "+ticket);
ticket--;
}else break;
}
finally {
//3.调用解锁方法
lock.unlock();
}
}
}
}
public class LockTest {
public static void main(String[] args) {
Window w = new Window();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.start();
t2.start();
t3.start();
}
}