Synchronized与ReentrantLock

Synchronized与ReentrantLock

SynchronizedReentrantLock
级别JVM(Java的一个关键字)API(JDK的一个类)
锁机制无锁 -> 偏向锁->轻量级锁->重量级锁公平锁和非公平锁
加锁方式自动加锁;不可中断;存在锁的升级;当发生阻塞时;等待的线程需一直等待;无获取当前线程持有锁状态的方法;需要手动加锁lock()和释放锁unlock();有中断机制(在代码块中使用lockInterruptibly方法,并在主线程中掉用interrupt可中断线程);不存在锁的升级;可设置线程等待时间(tryLock,有参可设置时间,成功返回true,失败返回false)

1. Synchronized

Synchronized是为解决多线程访问资源的同步性的java关键字,可修饰方法和代码块。

原理:

JVM基于进入和退出Monitor来实现代码同步,Jvm通过ACC_SYNCHRONIZED标志区分当前方法是否为同步方法。执行方法时当ACC_SYNCHRONIZED标识设置了,则当前线程持有monitor(monitorenter),然后执行方法体,执行结束后释放monitor(monitorexit)。

特性:

	原子性:通俗讲就是要么不执行,要么执行完毕;在多线程场景中,当某一线程获取到资源,直到当前线程执行完毕后释放资源,期间不可中断。
	可见性:共享变量在各个线程之间可见,在多线程场景中,各子线程均有属于自己的工作内存,在执行时讲主内存中的共享数据先赋值到自己的工作内存,在执行完毕后同步到主内存中,使其他线程可以看到主内存的最新数据。
	有序性:在一个线程中所有的执行都是有序的,但由于java存在重排序优化,不同线程之间的执行是无序的。
	重入性:当一个线程调用Synchronized获取到对象锁,在其方法内部再次通过Synchronized方法依旧可以获取到对象锁。(正常情况下,当获取到锁后,其他方法再次调用获取锁时,将出现互斥现象)

锁机制

偏向锁:当同步代码块或方法仅有一个线程,则不进行同步主内存。节省同步操作,提高性能。markword中biased_lock:1, lock:01 。
轻量级锁:当偏向锁存在多线程竞争时,将锁升级成轻量级锁。采用自旋(CAS)的方式获取锁,不会发生阻塞。优点:采用自旋形式获取锁,避免重量级锁引起的性能消耗;缺点:一直尝试获取锁,一直占用cpu
重量级锁:当线程空转达到上限,轻量级锁升级为重量级锁,进行阻塞,当前方法仅可有一个线程持有锁,其他线程阻塞等待。

2. ReentrantLock

ReentrantLock是JDK提供的一个类,用于解决多线程同步问题。

原理:

基于CAS和AQS实现,
CAS:Compare and Swap。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B;否则,什么都不做。该操作是一个原子操作。
AQS:Abstract Queued Synchronizer,是一个用于构建锁和同步容器的框架。有两个模式,独享模式与共享模式,使用一个volatile修饰的state属性表示状态,0代表无线程占用,其代表有现成占用;AQS是一个FIFO队列,AQS解决了在实现同步容器时设计的大量细节问题。

特性:

手动加锁:lock()
手动解锁:unlock()
获取锁状态:tryLock(),可传参设置等待时间,获取到锁返回true,未获取到返回false
可中断式加锁:线程B中使用lockInterruptibly()中断线程A加锁,再主线程中调用A.interrupt()唤醒线程A,此时发现线程A被中断。

锁机制

公平锁:有序获取阻塞队列中的线程,依据顺序获取锁。基于AQS实现
非公平锁:获取锁靠自己争取,基于CAS实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值