解决线程安全问题方式三:loke锁

 1 package day2_4;
 2 
 3 import java.util.concurrent.locks.ReentrantLock;
 4 
 5 /**
 6  * 解决线程安全问题方式三:loke锁  ---JDK5.0新增
 7  *
 8  * 1.面试题:synchronized 与 lock的异同?
 9  *   相同:两者都可以解决线程安全问题
10  *   不同:synchronized机制在执行完相应的代码以后,自动的释放同步监视器
11  *        lock需要手动的启动同步[lock()] ,也需要手动的结束同步[unlock()]
12  *
13  *
14  * 2.优先使用顺序:Lock -> 同步代码块 -> 同比方法
15  *
16  * 3.如何解决线程安全问题?有几种方式
17  *
18  * @Author Tianhao
19  * @create 2021-02-05-17:18
20  */
21 
22 class Window7 implements Runnable {
23     private int ticket = 100;
24 
25     //1.实例化ReentranLock
26     private ReentrantLock lock = new ReentrantLock();
27 
28     @Override
29     public void run() {
30 
31         while (ticket > 0) {
32             try {
33                 //2.调用锁定方法lock()
34                 lock.lock();
35                 if (ticket > 0) {
36                     System.out.println(Thread.currentThread().getName() +
37                             "卖票,票号:" + ticket);
38                     ticket--;
39                 }
40             } finally {
41                 //3.调用解锁方法 unlock()
42                 lock.unlock();
43             }
44             Thread.currentThread().yield();
45         }
46     }
47 }
48 
49 
50 public class WindowTest7 {
51     public static void main(String[] args) {
52         Window7 w = new Window7();
53         Thread t1 = new Thread(w);
54         Thread t2 = new Thread(w);
55         Thread t3 = new Thread(w);
56         t1.setName("窗口1");
57         t2.setName("窗口2");
58         t3.setName("窗口3");
59         t1.start();
60         t2.start();
61         t3.start();
62 
63     }
64 }
原文地址:https://www.cnblogs.com/zui-ai-java/p/14379083.html