一、synchronized关键字

1、实现原理:synchronized可以保证方法或者代码块在运行的时候,同一时刻只有一个线程可以执行这段代码(通过对象的对象头里的monitor实现),同时还保证其 共享变量的内存可见性(当对象获取到锁时,首先使其高速缓存失效,直接从内存中读取变量信息,然后当对象释放锁之前,强制刷新高速缓存,将更新的值同步到内存中去,下一个获取对象锁的线程也同样操作,即可实现其共享变量的内存可见性)

java中每个对象都可以作为锁,这个是synchronized实现同步的基础

2、缺点:无法中断锁,无法投票获得锁

二、volatile关键字

只保证了共享变量的内存可见性,不保证其原子性(修改变量之后写入内存,将其他用到此变量的缓存值置为失效)

三、volatile与synchronized区别

1、volatile本质是告诉jvm当前变量在工作内存中的值是不确定的,需要去主存中读取,而synchronized则是锁定当前变量,只有当前线程可以访问此变量,其他线程均无法访问

2、volatile可用在变量级别,而synchronized可以用在变量、方法、代码块上

3、volatile只实现了当前变量的修改可见性,而synchronized则实现了原子性+可见性

4、volatile不会造成线程阻塞,而synchronized会造成线程阻塞

四、Reentrantlock类

Reentrantlock比synchronized多了一些功能,如中断锁、定时锁等功能,方便在对象竞争激烈的情况下更好的执行任务

五、Reentrantlock与synchronized区别

1、Reentrantlock是类底层调用unsafe的park方法上锁,而synchronized是关键字,底层是采用对象的对象头信息上锁

2、synchronized会自动释放锁,而Reentrantlock不会,调用多少次就需要手动释放多少次锁。

03-28 04:51