有了synchronized,为什么还需要lock接口?

大家好,这里是五彩石编程,我是军哥。在java的多线程编程中,有两个功能相似的词语,一个叫synchronized,一个是lock,很多人在使用过程中都会有个疑问,既然有了synchronzied,为什么还需要lock呢?今天军哥就带着大家,用10分钟的时间,把这个问题搞清楚。


java中的线程模型

java从发布之日起,就支持了多线程的编程,在java早期,使用的是基于用户线程的技术来实现线程的,这样做的优点是不需要内核层面的支持,和线程相关的操作都是在用户线程中完成的,缺点也很明显,由于没有内核层面的支持,线程的调度、管理以及多处理器资源的分配等问题就变得非常的困难,所以java最终放弃了这种实现技术,转而使用了基于操作系统原生的线程模型来实现多线程,在这种技术下,用户创建的线程和操作系统中的线程是1:1的关系,同时为了支持大规模的并发,在Solaris这样既支持1:1,又支持多:多的平台上,java还提供了多:多的线程模型。

多线程编程中的主要问题

使用多线程时,需要关注的问题主要有两个:

  1. 线程的管理及调度
  2. 共享资源的管理

线程的管理

线程的管理指的是线程的生命周期管理,涉及什么时候创建一个线程,什么时候关闭一个线程,在实现层面可以分为手动管理和自动管理,手动管理就是自己创建线程,管理其生命周期,自动管理是指把线程交给类似线程池这样的技术来管理其生命周期

线程的调度

线程的调度分为两个方面,1个是操作系统层面的自动调度,分配时间片,另1个是用户手动控制线程的状态变化,来实现预定义的行为。

共享资源的管理

共享资源是指多个线程在运行时,都可以访问到的资源,那么在操作这些共享资源时,就涉及共享资源的访问管理,包含修改、访问等问题。

为什么会有synchronized?

在多个线程并发访问共享资源时,互斥同步是一种常见的解决方案,通过互斥这一手段,来实现资源的同步,而java语言通过设计了一个synchronized这一语言层面的关键字,来在编译后的字节码文件中加入monitorentermonitorexit指令,来实现线程间的互斥,monitor对应的技术,有两种翻译方法,一种用其字面意思,叫“监视器”,另一种翻译为“管程”,比较抽象,但翻译方法仁者见仁,智者见智,反正都是指实现互斥的这种技术。而这两个指令都需要一个对象来进行加锁和解锁,如果获取对象锁失败,那么当前线程就会阻塞等待,直到对象锁被另一个线程释放为止,这就是synchronized的主要的特点。

synchronized的缺点

在使用synchronized加锁后,线程的阻塞和唤醒就需要操作系统来帮忙了,而这一过程需要从用户态转换到内核态中,而状态的转换需要耗费很多处理器的时间,所以其操作相对来说代价就比较大,也就是我们常说的synchorized是个重量级锁的原因,同时如果两个线程各自持有了一个锁,同时又互相等待对方释放锁,这样就会造成死锁,所以synchronized在使用不当时,极易造成死锁,影响正常的业务逻辑,在实际使用中,也需要丰富的经验才能驾驭的了。

lock接口

由于synchronized的缺点及使用的不灵活,java在后续的版本中又加入了一个lock接口来改善这一情况,lock接口中主要增加了超时机制,尝试机制,中断机制等,该接口的核心实现ReentrantLock,也即可重入锁,它支持两种锁机制公平锁非公平锁

首先说明一下,锁的公平和非公平,是针对线程来说的。

可重入锁是通过CAS机制和队列来实现锁的,而CAS操作只需要调用cpu指令集中的compare and swap原语对应的指令即可,不存在用户态和内核态的转换,所以在这一块的时间消耗上,相比synchronized会有明显的优势,另外由于使用队列来进行线程加锁时的调度,所以在加锁时,也就自然的分为了让线程依次排队的公平锁,以及让线程直接尝试加锁的非公平锁两种锁的具体方式。


这就是java中既有synchronized又有lock接口的原因,为了让lock更方便使用,java还根据不同的场景,设计了很多多线程工具,这些就都在juc包中了,在这里就不展开说了!想了解更多的juc知识及java技术,请微信搜索并关注 “五彩石编程”公众号,军哥的文章将会持续同步更新。


  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值