



/*
__  解决线程安全问题的方式三;Lock锁 —- JDK5.0新增
 *
  1.面试题;synchronized 与 lock的异同?
 __  相同:二者都可以解决线程安全问题
 *  不同:synchronized机制在执行完相应的同步代码块以后,自动的释放同步监视器
        lock需要手动的启动同步( lock() ),同时结束同步也需要手动的实现( unlock() )
 __
 * 2.优先使用顺序:
  lock —>同步代码块 —>同步方法
 __
 *面试题;如何解决线程安全问题?有几种方式?
 
__  
package com.atguigu.java2;import java.util.concurrent.locks.ReentrantLock;/*** 解决线程安全问题的方式三;Lock锁 --- JDK5.0新增** 1.面试题;synchronized 与 lock的异同?* 相同:二者都可以解决线程安全问题* 不同:synchronized机制在执行完相应的同步代码块以后,自动的释放同步监视器* lock需要手动的启动同步( lock() ),同时结束同步也需要手动的实现( unlock() )** 2.优先使用顺序:* lock -->同步代码块 -->同步方法**面试题;如何解决线程安全问题?有几种方式?*** @author Dxkstart* @create 2021-05-07 19:58*/public class LockTest1 {public static void main(String[] args) {Window1 w = new Window1();Thread t1 = new Thread(w);Thread t2 = new Thread(w);Thread t3 = new Thread(w);t1.start();t2.start();t3.start();}}class Window1 implements Runnable{private int ticket = 100;//1.实例化ReentrantLockprivate ReentrantLock lock = new ReentrantLock();@Overridepublic void run() {while (true){try {//2.调用调用锁定方法:lock()lock.lock();if(ticket > 0){try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() +":售票,票号为:" + ticket);ticket --;}else{break;}} finally {//3.调用解锁方法:unlock()lock.unlock();}}}}
