-
什么是线程安全问题
答:当多个线程同时共享一个全局变量,做写的时候,可能会受到其他线程的干扰,导致数据有问题,这种现象叫做线程安全问题。做读的时候,不会产生线程安全的问题。对局部变量不会发生线程安全问题。 -
线程如何实现同步:即保证数据的原子性
解决办法:
synchronized–自动锁
lock–jdk1.5并发包–手动
同步的前提:
要有两个线程以上,需要发生同步;
多个线程想同步,必须要用同一把锁;
存在弊端:
竞争锁资源的时候,比较消耗资源。 -
什么地方需要加锁:真正产生共享同一全局变量的时候。
-
一个线程使用同步函数,另一个线程是同步代码快(this锁)能实现同步吗?可以
-
一个线程使用同步函数,另一个线程是同步代码块(非this锁)能实现同步吗?不可以
-
在方法上加上synchronized是非静态同步函数,在静态方法上加上synchronized是静态同步函数。
-
静态同步函数使用this锁吗?不使用
-
两个线程,一个线程使用同步函数,另一个线程使用静态同步函数能实现同步吗?
答:不能,同步函数使用this锁,静态同步函数使用当前字节码文件。 -
死锁的产生:同步中嵌套同步,互相不释放
-
多线程三大特性:
原子性:独一无二、一致性,保证线程安全
可见性:java内存模型
有序性:join,wait,notify(多线程之间通讯) -
什么是java内存模型:(属于)多线程可见性jmm,决定了一个线程与另一个线程是否可见。
主内存:主要存放共享的全局变量
私有本地内存:本地线程私有变量 -
jdk1.5并发包中有原子类例如AtomicInteger,底层采用的是CAS并发原语
CAS的全称为Compare-And-Swap,它是- -条CPU并发原语。
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。
CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会 帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的-一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原 子指令,不会造成所谓的数据不一致问题。之所以没有使用synchronized也是因为CAS原语是基于硬件的汇编语言底层语言的执行是原子指令,所以能实现原子功能。
CAS缺点:使用到了do-while循环,循环时间长,开销大
只能保证一个共享变量的原子操作
存在ABA问题
13. volatile作用:保证线程之间可见,但不保证原子性