• Synchronized 与 Lock 的使用


    Synchronized的使用

            以卖票为例

    1. //基本的卖票例子
    2. /*
    3. 真正的多线程开发,公司中的开发,降低耦合性
    4. 线程就是一个单独的资源类,没有任何附属的操作
    5. 1.属性、方法
    6. */
    7. public class SaleTicketDemo01 {
    8. public static void main(String[] args) {
    9. //多个线程操作同一个资源类
    10. Ticket ticket = new Ticket();
    11. //@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }
    12. new Thread(()->{
    13. for (int i = 0; i < 60; i++) {
    14. ticket.sale();
    15. }
    16. },"A").start();
    17. new Thread(()->{
    18. for (int i = 0; i < 60; i++) {
    19. ticket.sale();
    20. }
    21. },"B").start();
    22. new Thread(()->{
    23. for (int i = 0; i < 60; i++) {
    24. ticket.sale();
    25. }
    26. },"C").start();
    27. }
    28. }
    29. class Ticket {
    30. //属性、方法
    31. private int number = 50;
    32. //卖票的方式
    33. //synchronized 本质:队列,锁
    34. public synchronized void sale(){
    35. if (number>0){
    36. System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");
    37. }
    38. }
    39. }

    Lock锁

            需要手动加锁,释放锁

      Lock锁是一个接口,他有三个实现类:

    • ReentrantLock类
    • ReentrantReadWriteLock.ReadLock
    • ReentrantReadWriteLock.WriteLock

            以卖票为例

    1. //基本的卖票例子
    2. import java.util.concurrent.locks.Lock;
    3. import java.util.concurrent.locks.ReentrantLock;
    4. /*
    5. 真正的多线程开发,公司中的开发,降低耦合性
    6. 线程就是一个单独的资源类,没有任何附属的操作
    7. 1.属性、方法
    8. */
    9. public class SaleTicketDemo02 {
    10. public static void main(String[] args) {
    11. //多个线程操作同一个资源类
    12. Ticket2 ticket = new Ticket2();
    13. //@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }
    14. new Thread(()->{
    15. for (int i = 0; i < 5; i++) {
    16. ticket.sale();
    17. }
    18. },"A").start();
    19. new Thread(()->{
    20. for (int i = 0; i < 5; i++) {
    21. ticket.sale();
    22. }
    23. },"B").start();
    24. new Thread(()->{
    25. for (int i = 0; i < 5; i++) {
    26. ticket.sale();
    27. }
    28. },"C").start();
    29. }
    30. }
    31. class Ticket2 {
    32. //属性、方法
    33. private int number = 15;
    34. Lock lock = new ReentrantLock();
    35. //lock三部曲
    36. //1. new ReentrantLock()
    37. //2.lock.lock(); //加锁
    38. //3.finally =>lock.unlock(); //解锁
    39. public synchronized void sale(){
    40. lock.lock(); //加锁
    41. try {
    42. //业务代码
    43. if (number>0){
    44. System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");
    45. }
    46. } catch (Exception e) {
    47. e.printStackTrace();
    48. } finally {
    49. lock.unlock(); //解锁
    50. }
    51. }
    52. }

    Lock锁和synchronized的区别

    1. Synchronized是内置Java关键字;Lock是一个Java类。
    2. Synchronized无法判断获取锁的状态;Lock可以判断是否获取到了锁。(boolean b = lock.tryLock();)
    3. Synchronized会自动释放锁;Lock必须要手动释放锁,如果不释放锁,死锁。
    4. Synchronized线程1获得锁阻塞时,线程2会一直等待下去;Lock锁线程1获得锁阻塞时,线程2等待足够长的时间后中断等待,去做其他的事。
    5. Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可手动设置为公平锁)。
    6. Synchronized适合锁少量的代码同步问题;Lock适合锁大量的同步代码。

  • 相关阅读:
    【Linux】简单指令02
    数商云B2B商城系统个性化功能详解 | B2B电商模式赋能日化行业加快数字化发展
    使用Java实现哈夫曼编码
    【Python】可设置抽奖者权重的抽奖脚本
    前端项目负责人(虚拟岗)
    【网络】HTTP协议详解
    五个维度着手MySQL的优化,我和面试官都聊嗨了
    含文档+PPT+源码等]精品基于PHP实现的高校兼职招聘系统-前台Uniapp[包运行成功]计算机PHP毕业设计项目源码
    家庭燃气表微信抄表识别系统
    为什么价格监测要精确到款式
  • 原文地址:https://blog.csdn.net/weixin_48426115/article/details/127895248