java线程安全问题,CAS

  1. 什么是线程安全问题
    答:当多个线程同时共享一个全局变量,做写的时候,可能会受到其他线程的干扰,导致数据有问题,这种现象叫做线程安全问题。做读的时候,不会产生线程安全的问题。对局部变量不会发生线程安全问题。

  2. 线程如何实现同步:即保证数据的原子性
    解决办法:
    synchronized–自动锁
    lock–jdk1.5并发包–手动
    在这里插入图片描述
    同步的前提:
    要有两个线程以上,需要发生同步;
    多个线程想同步,必须要用同一把锁;
    存在弊端:
    竞争锁资源的时候,比较消耗资源。

  3. 什么地方需要加锁:真正产生共享同一全局变量的时候。

  4. 一个线程使用同步函数,另一个线程是同步代码快(this锁)能实现同步吗?可以

  5. 一个线程使用同步函数,另一个线程是同步代码块(非this锁)能实现同步吗?不可以

  6. 在方法上加上synchronized是非静态同步函数,在静态方法上加上synchronized是静态同步函数。

  7. 静态同步函数使用this锁吗?不使用

  8. 两个线程,一个线程使用同步函数,另一个线程使用静态同步函数能实现同步吗?
    答:不能,同步函数使用this锁,静态同步函数使用当前字节码文件。

  9. 死锁的产生:同步中嵌套同步,互相不释放

  10. 多线程三大特性:
    原子性:独一无二、一致性,保证线程安全
    可见性:java内存模型
    有序性:join,wait,notify(多线程之间通讯)

  11. 什么是java内存模型:(属于)多线程可见性jmm,决定了一个线程与另一个线程是否可见。
    主内存:主要存放共享的全局变量
    私有本地内存:本地线程私有变量

  12. 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作用:保证线程之间可见,但不保证原子性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章