问题整理 - 并发基础

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修饰之后,保证线程可见性与禁止指令重排序.

 

 

 

 

。。。。。。待完善。。。

 

。。。。。。待完善。。。

 

 

 

 

 






posted @ 2019-09-05 21:25  吴某1  阅读(117)  评论(0编辑  收藏  举报