1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

时间:2024-04-13 08:08:06

相关推荐

java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

作者:七里香的编程之路

出自:OSCHINA

原文:/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./* 创建时间:/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();}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。