首页 > 编程语言 >java中synchronized和Lock的区别?

java中synchronized和Lock的区别?

时间:2023-07-16 09:55:49浏览次数:39  
标签:释放 同步 java synchronized Lock 线程 等待

synchronizedLock是Java中两种不同的实现线程同步的机制。下面是它们之间的主要区别:

  1. 可重入性:

    • synchronized是可重入的,同一个线程可以多次获得同一个锁。
    • Lock也是可重入的,同一个线程可以多次获得同一个锁。但需要手动释放相同次数的锁。
  2. 粒度:

    • synchronized可以用于修饰方法或代码块,粒度较粗。当一个线程进入synchronized区块时,其他线程需要等待锁的释放。
    • Lock则更加灵活,可以根据需求选择只锁定代码中的一部分。可以使用多个锁,实现更精细的线程同步控制。
  3. 锁的获取:

    • synchronized在进入同步代码块时自动获取锁,退出同步代码块时自动释放锁。
    • Lock需要手动获取锁和释放锁,通过lock()unlock()方法进行控制。
  4. 锁的条件:

    • synchronized内部的锁具有隐式条件队列,线程在锁上等待时会进入等待队列,当锁被释放时,会从等待队列中选择一个线程进行唤醒。
    • LockCondition对象代表,可以通过newCondition()方法获取。一个锁可以有多个Condition,每个Condition对象可以管理一个等待队列。
  5. 可中断性:

    • synchronized是不可中断的,一个线程在等待锁时,只能选择一直等待,或者执行任务。
    • Lock提供了lockInterruptibly()方法,可以在等待锁的过程中响应中断信号。

总体而言,Lock相较于synchronized提供了更多的灵活性和功能,能够更精确地控制线程的同步。但相对来说,使用Lock会更复杂,需要手动释放锁和处理异常,需要更细致地控制锁的获取和释放。在某些特定的应用场景下,Lock可能是更好的选择,特别是要求高度定制的同步需求。而对于一般的线程同步情况,synchronized已经足够简单和高效。

标签:释放,同步,java,synchronized,Lock,线程,等待
From: https://www.cnblogs.com/ketoli/p/17557473.html

相关文章

  • JAVA面试题----Redis
    Redisredis快的原因:完全基于内存操作,请求都在内存中所以快;它是单线程,省去了线程切换的时间和锁竞争的开销。采用io多路复用,多路指多个网络,对单个线程进行复用,避免了大量无用的操作。为什么使用redis:速度快,支持丰富的数据类型,redis集群不支持事务,内部单节点支持事务,操作都是原子......
  • JAVA----线程池
    线程池线程的状态:1新建状态(没启动)2可运行状态(可能在运行,也可能等待cpu时间片)3阻塞(等待获取排他锁,或者等待其他线程唤醒,不醒无法获取时间片)4限期等待(一段时间后被系统自动唤醒)5死亡:可能任务执行结束或产生异常结束。线程池的状态:RUNNING:运行状态,可以接受新任务......
  • JAVA面试题----MYSQL
     MYSQL。          mysql使用的引擎是InnoDB,它有四大特性:1插入缓冲2二次写3自适应hash索引(ahi),就不用走B+树了;4预读。使用InnoDB因为它是事务安全的存储引擎,它具备提交,回滚以及崩溃恢复的功能以及保护用户数据。MYSQL的索引分类:1主键索引2,唯一索引3.复合索......
  • Java方法
    Java方法何为方法?System.out.println(),那么它是什么呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中创建,在其他方法被引用设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。......
  • java的cmd命令行和jsch执行压测
    前言项目中用到了cmd命令去执行,但是发现一个问题就是,当需要切换用户和执行命令的时候特别的麻烦,所以后面又该用了jsch的连接方式,测试一下性能理想不理想,看看有劣势。相关配置ssh的连接数#cat/etc/ssh/sshd_config|grepMaxSessions#MaxSessions1000测试代码@GetMapping("/cmd"......
  • Java数组
    0x01认识数组1、什么是数组数组就是用来存储一批同种类型数据的容器。int[]arr={20,10,80,60,90};String[]names={"张三","李四","王二"};2、为什么要用数组假如用变量学生名字,然后完成随机点名功能,怎么实现?存在有什么问题?Stringname1="张誉";Stringnam......
  • java写入数据 加锁操作
    publicstaticvoidmain(Stringargs[]){ ConnectionconnMySQL=null; Statementstmt=null; StringstrJDBC_DRIVER="com.mysql.cj.jdbc.Driver";//java8的链接写法,java5把cj.去掉就行StringstrDB_URL="jdbc:mysql://localhost:3306......
  • JavaScript
    html<!DOCTYPEhtml><htmllang="en"xmlns="http://www.w3.org/1999/html"><head><metaname="author"content="weiyupeng"><metaname="time"content="2023/7/1020:23"......
  • java-base-two
    ArrayList扩容机制扩容一半(默认方式):当容量不足时,ArrayList将容量扩大为原来的1.5倍,即将原来的容量除以2,然后加上原来的容量。       如果新创建的集合有带初始值,默认就是传入的大小,在初始化时就会用传入的大小不会扩容,当大小不够后再去扩容。在方法中定义......
  • 吊打面试官的16000字JVM专属秘籍,又一个Java面试神器!
    前言吊打面试官的16000字JVM专属秘籍,总共包含三部分的内容,从基础到进阶带大家一步步深入理解JVM!学完就可以在简历上面直接写上精通JVM!因为篇幅限制这里只给大家做简单的一个介绍,也就是进行一个大点的梳理,每个大点下面又有很多细枝末节的技能知识需要大家好好学透,并且能够掌握吸收到......