一、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不会,调用多少次就需要手动释放多少次锁。