java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结
生活随笔
收集整理的這篇文章主要介紹了
java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:七里香的編程之路
出自:OSCHINA
原文:my.oschina.net/u/4098550/blog/4548274
能保證可見性的措施
除了volatile 可以讓變量保證可見性外.happens-before九大規則. 都是能夠保證可見性的. 其中就包含了鎖操作(synchronized 和 lock) 和 volatile 修飾的變量
synchronized作用的升華
- synchronized 關鍵字不僅僅保證了其代碼塊中的原子性 ,也保證了可見性. 例如如下代碼中的i++操作 , 使用了synchronized 代碼塊保護起來, 使得兩個線程對其相加的時候, 可以正確的得出20萬的結果.
這個結果不僅僅是保證了其i相加時候的原子性. 也說明保證了其可見性. 否則一個線程加完了之后, 另外一個線程沒有獲取i的最新的值的話, 也會導致相加的結果變少.
- synchronized 不僅僅讓被保護的代碼安全, 還會保證對synchronized 修飾的代碼執行完畢之后, 下一個synchronized 進入之前, 整個synchronized 保護的代碼塊,都會被之后執行的代碼看得到. 并且synchronized 之前的所有的代碼也會被看到 . 如下面這幅圖, 線程B拿到鎖之后, 對于線程A的所有的操作都是可見的. 這是一個連帶效應.
性的代碼進行了修改. 把賦值操作的方法中, 最后一個變量的賦值, 加上了synchronized修飾. 打印的方法中, 第一行代碼加上了synchronized修飾. 這樣就保證了原子性和可見性. 寫線程在執行完成d=6的時候, 會釋放鎖. 打印的線程獲得鎖的時候, 就能知道寫線程的所有的操作, 獲得其最新的值.
package com.thread.jmm;/*** 類名稱:FieldVisibility* 類描述: 演示可見性問題** @author: https://javaweixin6.blog.csdn.net/* 創建時間:2020/9/5 14:31* Version 1.0*/
public class FieldVisibility {int a = 1;int b = 2;int c = 3;int d = 4;//給a 賦值, 并把值給bprivate void change() {a = 3;b = a;c = a;synchronized (this) {d = 6;}}/*** 打印出a b*/private void print() {synchronized (this) {int aa = a ;}int bb = b ;int cc = c ;int dd = d ;System.out.println("b=" + b + ";a=" + a);}public static void main(String[] args) {while (true) {FieldVisibility test = new FieldVisibility();new Thread(() -> {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}//給 a b 重新賦值test.change();}).start();new Thread(() -> {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}//給 a b 打印出來test.print();}).start();}}
}
總結
以上是生活随笔為你收集整理的java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贝维诗coco洗发水怎么样
- 下一篇: : error c2062: 意外的类型