问:synchronized和ReentrantLock的区别?java
ReentrantLock(可重入锁)数组
ReentrantLock公平性设置缓存
ReentrantLock fairLock = new ReentrantLock(true);
参数为ture时,倾向于将锁赋予等待时间最久的线程安全
公平锁:获取锁的顺序按前后调用lock方法的顺序(慎用,一般公平性没有想象的那么重要,java默认的调用策略不多会有饥饿状况的发生,与此同时若要保证公平性,会增长额外的开销,致使必定的吞吐量降低)多线程
非公平锁:获取锁的顺序是无序的,synchronized是非公平锁并发
例子:app
package interview.thread; import java.util.concurrent.locks.ReentrantLock; /** * @Author: cctv * @Date: 2019/5/21 11:46 */ public class ReentrantLockDemo implements Runnable { private static ReentrantLock lock = new ReentrantLock(false); @Override public void run() { while (true) { lock.lock(); System.out.println(Thread.currentThread().getName() + " get lock"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } public static void main(String[] args) { ReentrantLockDemo rtld = new ReentrantLockDemo(); Thread t1 = new Thread(rtld); Thread t2 = new Thread(rtld); t1.start(); t2.start(); } }
公平锁 new ReentrantLock(true);框架
非公平锁 new ReentrantLock(false);jvm
ReentrantLock将锁对象化ide
是否能将wait\notify\notifyAll对象化
总结synchronized和ReentrantLock的区别:
问:什么是Java内存模型中的happens-before?
java内存模型(即Java Memory Model 简称JMM)是一种抽象概念,并不真实存在,它描述的是一组规则或规范,经过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式
JMM中的主内存
JMM中的工做内存
JMM和java内存区域划分是不一样的概念层次:
主内存和工做内存的数据存储类型以及操做方式概括:
JMM如何解决可见性问题?
首先要讲下重排序:在执行程序时,为了提升性能,编译器和处理器经常会对指令作重排序。
指令重排序须要知足的条件:
happens-before的八大原则:
若是两个操做不知足上述任意一个happens-before规则,那么这两个操做就没有顺序的保障,JVM能够对这两个操做进行重排序
若是操做A happens-before B 那么操做A在内存上所作的操做对操做B都是可见的
volatile:jvm提供的轻量级同步机制,解决了内存可见性问题,但并非线程安全的(能够配合synchronized达到线程安全目的)
问:volatile变量如何当即可见?
当写一个volatile变量时,JMM会把该线程对应的工做内存中的共享变量刷新到主内存中
当读取一个volatile变量时,JMM会把该线程对应的工做内存置为无效,该线程只能从主内存中读取变量
问:volatile变量如何禁止重排优化?
内存屏障(Memory Barrier)
经过插入内存屏障指令禁止在内存屏障先后的指令执行重排序优化,强制刷出各类CPU的缓存数据,所以任何CPU上的线程都能读取到这些数据的最新版本
package interview.thread; /** * 单例模式的双重检测实现 * * @Author: cctv * @Date: 2019/5/21 17:19 */ public class Singleton { // 禁止指令重排序优化 private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance() { //第一次检测 if (instance == null) { //同步 synchronized (Singleton.class) { // 第二次检测 if (instance == null) { // 多线程环境下可能会出现问题的地方(会出现指令重排序,致使instance先赋值后初始化Singleton) instance = new Singleton(); } } } return instance; } }
volatile和synchronized的区别
问:谈谈 CAS(Compare and Swap)?
一种高效实现线程线程安全的方法
cas思想:
包含三个操做数--内存位置V 预期原值A 和 新增B
缺点: