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

 1 package com.atfu.java01;
 2 
 3 import java.util.concurrent.locks.ReentrantLock;
 4 
 5 /**
 6  * 解决线程安全问题的方式三:Lcok锁-------Jdk5.0新增
 7  * 1.面试题:synchronized 与 lock的异同?
 8  *   相同:二者都可以解决线程安全问题
 9  *  不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器
10  *       lock需要手动的启动同步,同时也需要手动的结束同步
11  * 2.优先使用顺序:Lock-->同步代码块(已经进入了方法体,分配了相应资源---->同步方法(在方法体之外)
12  *
13  * 面试题:如何解决线程安全问题?有几种方式
14  *
15  * @author fu jingchao
16  * @creat 2021/10/27-13:11
17  */
18 class window implements Runnable{
19 
20     private int ticket = 100;
21     //1.实例化ReentrantLock
22     private ReentrantLock lock = new ReentrantLock();//如果是使用继承类的方式创建多线程,那lock要声明为静态的,要保证
23                                                         // 所有线程共用一把锁。
24 
25     @Override
26     public void run() {
27         while (true) {
28             try {
29                 //2.调用锁定方法lock()
30                 lock.lock();
31                 if (ticket > 0) {
32                     try {
33                         Thread.sleep(100);
34                     } catch (InterruptedException e) {
35                         e.printStackTrace();
36                     }
37                     System.out.println(Thread.currentThread().getName() + ":售票,票号为:" + ticket);
38                     ticket--;
39                 } else {
40                     break;
41                 }
42             } finally {
43                 //3.调用解锁方法:unlock()
44                 lock.unlock();
45             }
46         }
47     }
48 }
49 
50 public class LockTest {
51     public static void main(String[] args) {
52         window w = new window();
53 
54         Thread t1 = new Thread(w);
55         Thread t2 = new Thread(w);
56 
57         t1.setName("窗口一");
58         t2.setName("窗口二");
59         t1.start();
60         t2.start();
61     }
62 }

 

posted @ 2021-10-27 19:38  橘猫的夏天  阅读(146)  评论(0编辑  收藏  举报