解决线程安全问题的方式三: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 }
此为本人学习笔记,若有错误,请不吝赐教