iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JUC中的Lock锁与synchronized同步代码块问题怎么解决
  • 422
分享到

JUC中的Lock锁与synchronized同步代码块问题怎么解决

2023-06-29 23:06:58 422人浏览 安东尼
摘要

这篇文章主要介绍“JUC中的Lock锁与synchronized同步代码块问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JUC中的Lock锁与synchronized同步代码块问题怎么解

这篇文章主要介绍“JUC中的Lock与synchronized同步代码块问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JUC中的Lock锁与synchronized同步代码块问题怎么解决”文章能帮助大家解决问题。

一、Lock锁

  • ReentrantLock类: 可重用锁(公平锁|非公平锁)

  • ReentrantReadWriteLock.ReadLock:读锁

  • ReentrantReadWriteLock.WriteLock:写锁

二、锁的底层

锁的底层有公平锁和非公平锁。其中:

  • 公平锁 :十分公平,不能插队。

  • 非公平锁 :十分不公平,可以插队。(默认非公平锁)

三、案例

案例一:传统的synchronized实现

public class SaleTicketDemo01 {    public static void main(String[] args) {        Ticket ticket = new Ticket();        new Thread(()->{            for (int i = 0; i < 60; i++) {                ticket.sale();            }        },"AA").start();        },"BB").start();        new Thread(() -> {        }, "CC").start();    }    static class Ticket{        // 50张飘票        private int num = 50;        // 售票 synchronized(同步代码块) 本质: 队列,锁        public synchronized void sale(){            if (num > 0){                System.out.println(Thread.currentThread().getName()+"卖出了"+(num--)+"票,剩余:"+num);        }}

案例二:Lock锁的实现

public class SaleTicketDemo02 {    public static void main(String[] args) {        Ticket2 ticket = new Ticket2();        new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"AA").start();        new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"BB").start();        new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"CC").start();    }    static class Ticket2{        // 50张飘票        private int num = 50;        // 加锁三部曲        // 1、 创建锁 => new ReentrantLock();        // 2、 加锁 =>  lock.lock();        // 3、 释放锁 => lock.unlock();        public void sale(){            // 可重入锁  默认:非公平锁:十分不公平,可以插队。(默认非公平锁)            Lock lock = new ReentrantLock();            // 加锁            lock.lock();            try {                // 执行业务                if (num > 0){                    System.out.println(Thread.currentThread().getName()+"卖出了"+(num--)+"票,剩余:"+num);                }            } catch (Exception e) {                e.printStackTrace();            } finally {                // 解锁                lock.unlock();            }        }    }}

四、Lock锁和synchronized的区别

  1. snchronized是内置Java关键字;Lock是一个Java类。

  2. synchronized 无法判断获取锁的状态;Lock可以判断是否获取到了锁。(boolean b = lock.tryLock();)

  3. synchronized会自动释放锁Lock必须要手动释放锁,如果不释放锁,死锁

  4. synchronized线程1获得锁阻塞时,线程2会一直等待下去;Lock锁线程1获得锁阻塞时,线程2等待足够长的时间后中断等待,去做其他的事。

  5. synchronized可重入锁:不可以中断的,非公平;Lock可重入锁:可以判断锁,非公平(可以自己设置)。

  6. lock.lockInterruptibly();方法:当两个线程同时通过该方法想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。

  7. synchronized适合锁少量的代码同步问题; Lock适合锁大量的同步代码。

关于“JUC中的Lock锁与synchronized同步代码块问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: JUC中的Lock锁与synchronized同步代码块问题怎么解决

本文链接: https://www.lsjlt.com/news/326770.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JUC中的Lock锁与synchronized同步代码块问题怎么解决
    这篇文章主要介绍“JUC中的Lock锁与synchronized同步代码块问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JUC中的Lock锁与synchronized同步代码块问题怎么解...
    99+
    2023-06-29
  • Java并发系列之JUC中的Lock锁与synchronized同步代码块问题
    目录一、Lock锁二、锁的底层三、案例案例一:传统的synchronized实现案例二:Lock锁的实现四、Lock锁和synchronized的区别写在前边: 在Java服务端中,...
    99+
    2024-04-02
  • 怎么解决python-redis-lock分布式锁的问题
    本篇内容介绍了“怎么解决python-redis-lock分布式锁的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题背景在使用cele...
    99+
    2023-06-25
  • Java中的AQS同步队列问题怎么解决
    这篇文章主要介绍“Java中的AQS同步队列问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的AQS同步队列问题怎么解决”文章能帮助大家解决问题。AQS 同步队列1、AQS 介绍...
    99+
    2023-07-02
  • 怎么解决Mysql主从不同步问题的
    本篇内容主要讲解“怎么解决Mysql主从不同步问题的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决Mysql主从不同步问题的”吧!由于各种原因,mysq...
    99+
    2024-04-02
  • Ubuntu与Windows双系统时间不同步的问题怎么解决
    本篇内容主要讲解“Ubuntu与Windows双系统时间不同步的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu与Windows双系统时间不同步的问题怎么解决”吧!为什么U...
    99+
    2023-06-16
  • C++中代码优化问题的分析与解决方法
    C++中代码优化问题的分析与解决方法摘要:在进行C++程序开发时,我们常常需要关注代码的性能优化。本文将介绍一些常见的代码优化问题,并提供相应的解决方法和具体代码示例,旨在帮助读者提高C++程序的执行效率。内存管理问题内存管理是代码优化中一...
    99+
    2023-10-22
    内存管理 (Memory management) 并发编程 (concurrent programming) 优化算法
  • C++中代码优化问题的分析与解决方案
    C++中代码优化问题的分析与解决方案在C++编程中,代码优化是一个重要的方面。优化代码可以使程序执行效率更高,运行速度更快,并减少资源的占用。本文将探讨一些常见的代码优化问题,并提供相应的解决方案和具体的代码示例。避免频繁的内存分配与释放在...
    99+
    2023-10-22
    优化策略 (Optimization strategy) 性能分析 (Performance Analysis) 微优化
  • 如何解决PHP开发中的代码重用和模块化问题
    在 PHP 开发中,代码重用和模块化是提高开发效率和代码质量的重要因素。代码重用指的是在不同的地方使用相同的代码,而模块化则是将代码划分为独立的功能模块,使其具有高内聚、低耦合的特性。本文将介绍一些实用的技巧和方法,帮助你解决 PHP 开发...
    99+
    2023-10-21
    代码重用 PHP开发 模块化问题
  • C语言多线程开发中死锁与读写锁问题怎么解决
    今天小编给大家分享一下C语言多线程开发中死锁与读写锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。死锁有时,一个...
    99+
    2023-06-30
  • mybatis中字段名与关键字相同问题怎么解决
    这篇文章主要介绍“mybatis中字段名与关键字相同问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis中字段名与关键字相同问题怎么解决”文章能帮助大家解决问题。mybatis中...
    99+
    2023-07-05
  • C++中常见的代码性能问题分析与解决方案
    C++中常见的代码性能问题分析与解决方案导语:在C++开发过程中,优化代码性能是一项非常重要的任务。性能问题可能会导致程序运行缓慢、资源浪费甚至崩溃。本文将详细介绍C++中常见的代码性能问题,并提供相应的解决方案。同时,还会给出具体的代码示...
    99+
    2023-10-22
    解决方案 关键词:C++ 代码性能 问题分析
  • Java线程技术中的死锁问题怎么解决
    这篇文章主要介绍“Java线程技术中的死锁问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程技术中的死锁问题怎么解决”文章能帮助大家解决问题。我们知道,使用 synchroniz...
    99+
    2023-06-02
  • JAVA中的Unicode编码问题怎么解决
    在Java中解决Unicode编码问题有多种方法:1. 使用正确的字符编码读取和写入文件:当从文件中读取或写入文本时,需要注意使用正...
    99+
    2023-08-19
    JAVA
  • Java多线程之常见锁策略与CAS中的ABA问题怎么解决
    本文小编为大家详细介绍“Java多线程之常见锁策略与CAS中的ABA问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java多线程之常见锁策略与CAS中的ABA问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • mysql中RR与幻读的问题怎么解决
    这篇“mysql中RR与幻读的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“m...
    99+
    2024-04-02
  • 怎么解决Oracle中dg主库创建文件备库未同步问题
    这篇文章主要介绍“怎么解决Oracle中dg主库创建文件备库未同步问题”,在日常操作中,相信很多人在怎么解决Oracle中dg主库创建文件备库未同步问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • Git Bash中文乱码的问题怎么解决
    本文小编为大家详细介绍“Git Bash中文乱码的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Git Bash中文乱码的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-30
  • 怎么解决php的exit中文乱码问题
    这篇文章将为大家详细讲解有关怎么解决php的exit中文乱码问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑如何解决p...
    99+
    2023-06-29
  • Java代码引起的NATIVE野指针问题怎么解决
    Java代码引起的NATIVE野指针问题怎么解决,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实施hook:我们有了hook,但目前还不知道是哪个so中释放了f...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作