- 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 Windows 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) {
- Windows w = new Windows();
- Thread t1 = new Thread(w);
- Thread t2 = new Thread(w);
- Thread t3 = new Thread(w);
- t1.start();
- t2.start();
- t3.start();
- }
- }
来源: http://www.bubuko.com/infodetail-3364793.html