问题整理(并发基础)
Posted webster1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题整理(并发基础)相关的知识,希望对你有一定的参考价值。
1、Java内存模型是什么?
Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
Java内存模型对一个线程所做的变动能被其它线程可见提供了保证
cpu和主内存同步的过程中 系统会为cpu并行指令做一些重排序优化,从而提高了效率
在并发编程模式中,势必会遇到上面三个概念
1、可见性
2、有序性
3、原子性
在Java中提供了一系列和并发处理相关的关键字,比如volatile、synchronized、final包等
JMM提供的解决方案:
可以使用synchronized关键字或者重入锁(ReentrantLock)保证程序执行的原子性 而工作内存与主内存同步延迟现象导致的可见性问题
也可以使用volatile关键字解决 可以使一个线程修改后的变量立即对其他线程可见 volatile的另外一个作用就是禁止重排序优化
2、Java中CyclicBarrier 和 CountDownLatch有什么不同?
CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与 CyclicBarrier 不同的是,CountdownLatch 不能重新使用,
CyclicBarrier ++ 到指定值 , CountDownLatch countDown-- await() //等待,当计数减到0时,所有线程并行执行
3、volatile是什么?
主要是用来在多线程中同步变量 (读指令和写指令都会插入 内存屏障)
当一个变量被volatile修饰后,该变量就不能被缓存到线程的内存中,它会告诉编译器不要进行任何移出读取和写入操作的优化,(线程-> cpu寄存器 -> cpu缓存 -> 主内存)
1.保证此变量对所有的线程的可见性 (保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新) (内存可见性是通过store(写)和load(读)指令完成的)
2.禁止指令重排序优化 (指令重排序时不能把后面的指令重排序到内存屏障之前的位置)
volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性.
字段是volatile,Java内存模型将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令
7、什么是线程安全?Vector是一个线程安全类吗?
多线程和单线程每次运行结果和单线程运行的结果是一样的,就是线程安全的
Vector 不是线程安全的,只能保证单个操作安全,复合操作同样不安全
8、什么是竞态条件?
多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的bugs,因为线程间的随机竞争
13、什么是FutureTask?
可用于异步获取执行结果或取消执行任务的场景
只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞 。。。。。。待完善。。。
16、同步集合与并发集合有什么区别
不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性
同步集合类:Hashtable、Vector
并发集合类:ConcurrentHashMap (对相关的几个片段上锁,同时允许多线程访问其他的片段)
同步集合比并发集合会慢得多,主要原因是锁(synchronized)
15、如果同步块内的线程抛出异常会发生什么? 线程都会释放锁
17、单例模式的双检锁是什么?
if(instance==null) {
synchronized(Singleton4.class) {
if(instance==null) {
instance = new Singleton4();
}
}
}
第一个if 一个锁
兼顾线程安全性与非null性判断.
18、为什么使用voliate修饰变量?
使用voliate修饰之后,保证线程可见性与禁止指令重排序.
。。。。。。待完善。。。
。。。。。。待完善。。。
以上是关于问题整理(并发基础)的主要内容,如果未能解决你的问题,请参考以下文章
吐血整理超全 Java 进阶教程:基础 + 容器 + 并发 + 虚拟机 +IO