• Java并发之原子性,有序性,可见性,以及Happen-Before原则


    原子性

    原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,操作一旦开始,也不会被其他线程干扰。即原子操作是一个做小操作。

    例如 i++,其实经历了读,算,赋值绝对算不上是一个原子操作。一个i = 10这样的赋值操作可以称为原子操作。

    java.util.comcurrent.atomic包里都是关于原子操作的类,有时间会另写一篇博客。

    有序性

    提到有序那必然就有乱序,而乱序是因为jvm的指令重排优化而产生的。

    我们要想完全保住有序性,需要给对象加同步锁(synchronized),这样做实际上就是单线程执行了。

    可见性

    可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。 

    而其他线程看不到实际上是因为每个cpu都有寄存器,有一个线程把寄存器里的值修改了并提交到jvm了,而还有一个cpu的寄存器里存着数据的缓存,等它回头看jvm的时候,发现值已经变了。

    Java提供了volatile关键字来保证可见性。

    当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

    下面用一段代码来做测试。

    public class VisibilityTest extends Thread{
      //如果没有关键字volatile,会发现这个线程停不掉,可自行测试。
    private volatile boolean stop; public void run() { int i = 0; while (!stop) { i++; } System.out.println("finish loop,i=" + i); } public void stopIt() { stop = true; } public boolean getStop() { return stop; } public static void main(String[] args) throws InterruptedException { VisibilityTest visibilityTest = new VisibilityTest(); visibilityTest.start(); visibilityTest.sleep(1000); visibilityTest.stopIt(); System.out.println(visibilityTest.getStop()); } }

    除了volatile还有两种解决可见性问题的方法:

    1. final关键字,能够解决的原因:final常量会进常量区(以前的方法区,现在的Metaspace),常量区是线程安全的,线程安全就是一个线程占有着此资源的时候,其他线程不能占有,所以可想而知,只要A线程在对此资源做任何操作,B线程都是等待着的,当A释放了,B才去jvm拿值,这样也算保证了可见性。

    2. synchronized关键字,原因和上面一样,同步锁,保证了线程安全。

    Happen-Before原则

     程序顺序原则:一个线程内保证语义的串行性 a=1 b=a+1

     volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性

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

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

     线程的start()方法先于它的每一个动作  线程的所有操作先于线程的终结(Thread.join())

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

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

  • 相关阅读:
    iOS开发之UIWebView自动滑动到顶部-备
    Android开发者须知的几种APP加密方式--备
    UITableView 小节-备
    判断字符串是否为数字-备
    关于iOS上的对象映射公用方法-备
    嵌入式开发之项目---uboot 内存合集
    多媒体开发之---h.264 SPS PPS解析源代码,C实现一以及nal分析器
    YUV视频格式到RGB32格式转换的速度优化 上篇
    多媒体开发之---音视频解码 视频回调的空转陷阱
    收集的网络上大型的开源图像处理软件代码(提供下载链接)
  • 原文地址:https://www.cnblogs.com/NoYone/p/8541898.html
Copyright © 2020-2023  润新知