image.png
    image.png
    image.png
    image.png

    /*
    __
    解决线程安全问题的方式三;Lock—- JDK5.0新增
    *
    1.面试题;synchronized lock的异同?
    __
    相同:二者都可以解决线程安全问题
    * 不同:synchronized机制在执行完相应的同步代码块以后,自动的释放同步监视器
    lock需要手动的启动同步( lock() ,同时结束同步也需要手动的实现( unlock()
    __

    * 2.优先使用顺序:
    lock —>同步代码块 —>同步方法
    __

    *面试题;如何解决线程安全问题?有几种方式?

    __

    1. package com.atguigu.java2;
    2. import java.util.concurrent.locks.ReentrantLock;
    3. /**
    4. * 解决线程安全问题的方式三;Lock锁 --- JDK5.0新增
    5. *
    6. * 1.面试题;synchronized 与 lock的异同?
    7. * 相同:二者都可以解决线程安全问题
    8. * 不同:synchronized机制在执行完相应的同步代码块以后,自动的释放同步监视器
    9. * lock需要手动的启动同步( lock() ),同时结束同步也需要手动的实现( unlock() )
    10. *
    11. * 2.优先使用顺序:
    12. * lock -->同步代码块 -->同步方法
    13. *
    14. *面试题;如何解决线程安全问题?有几种方式?
    15. *
    16. *
    17. * @author Dxkstart
    18. * @create 2021-05-07 19:58
    19. */
    20. public class LockTest1 {
    21. public static void main(String[] args) {
    22. Window1 w = new Window1();
    23. Thread t1 = new Thread(w);
    24. Thread t2 = new Thread(w);
    25. Thread t3 = new Thread(w);
    26. t1.start();
    27. t2.start();
    28. t3.start();
    29. }
    30. }
    31. class Window1 implements Runnable{
    32. private int ticket = 100;
    33. //1.实例化ReentrantLock
    34. private ReentrantLock lock = new ReentrantLock();
    35. @Override
    36. public void run() {
    37. while (true){
    38. try {
    39. //2.调用调用锁定方法:lock()
    40. lock.lock();
    41. if(ticket > 0){
    42. try {
    43. Thread.sleep(50);
    44. } catch (InterruptedException e) {
    45. e.printStackTrace();
    46. }
    47. System.out.println(Thread.currentThread().getName() +
    48. ":售票,票号为:" + ticket);
    49. ticket --;
    50. }else{
    51. break;
    52. }
    53. } finally {
    54. //3.调用解锁方法:unlock()
    55. lock.unlock();
    56. }
    57. }
    58. }
    59. }