Java教程:JVM的详解(十七)

开课吧开课吧锤锤2021-03-02 14:33

    Java是由SunMicrosystems公司于1995年5月推出的高级程序设计语言。Java可运行于多个平台,如Windows,MacOS及其他多种UNIX版本的系统。本文提供Java语言相关相关教程,赶快学习起来吧。

Java

    volatile特性

    多线程中的可见性

    可见性:就是一个线程修改了变量,其他线程可以知道

    保证可见性的常见方法:volatile、synchronized、final(一旦初始化完成,其他线程就可见)

    volatile

    volatile基本上是JVM提供的最轻量级的同步机制,用volatile修饰的变量,对所有的线程可见,即对volatile变量所做的写操作能立即反映到其他线程中

    用volatile修饰的变量,在多线程环境下仍然是不安全的

    volatile修饰的变量,是禁止指令重排优化的

    适合使用valatile的场景

    运算结果不依赖变量的当前值

    确保只有一个线程修改变量的值

    指令重排

    指令重排:指的是JVM为了优化,在条件允许的情况下,对指令进行一定的重新排列,直接运行当前能够立即执行的后序指令,避开获取下一条指令所需数据造成的等待

    线程内串行语义,不考虑多线程间的语义

    不是所有的指令都能重排,比如:

    写后读a=1;b=a;写一个变量之后,再读这个位置

    写后写a=1;a=2;写一个变量之后,再写这个变量

    读后写a=b;b=1;读一个变量之后,再写这个变量

    以上语句不可重排,但是a=1;b=2;是可以重排的

    程序顺序原则:一个线程内保证语义的串行性

    volatile规则:volatile变量的写,先发生于读

    锁规则:解锁(unlock)必然发生在随后的加锁(lock)前

    传递性:A先于B,B先于C,那么A必然先于C

    线程的start方法先于它的每一个动作

    线程的所有操作先于线程的终结

    线程中断(interrupt())先于被中断线程的代码

    对象的构造函数执行结束先于finalize()方法

    Java线程安全的处理方法

    不可变是线程安全的

    互斥同步(阻塞同步):synchronized、java.util.concurrent.ReentrantLock。目前这两个方法性能已经差不多了,建议优先选用synchronized,ReentrantLock增加了如下特性:

    等待可中断:当持有锁的线程长时间不释放锁,正在等待的线程可以选择放弃等待

    公平锁:多个线程等待同一个锁时,须严格按照申请锁的时间顺序来获取锁

    锁绑定多个条件:一个ReentrantLock对象可以绑定多个condition对象,而synchronized是针对一个条件的,如果要多个,就得有多个锁

    非阻塞同步:是一种基于冲突检查的乐观锁策略,通常是先操作,如果没有冲突,操作就成功了,有冲突再采取其他方式进行补偿处理

    无同步方案:其实就是在多线程中,方法并不涉及共享数据,自然也就无需同步了

    以上内容由开课吧老师「宇酱」提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享