关于synchronized是否能保证可见性。
来源:互联网 发布:手机魔音软件下载 编辑:程序博客网 时间:2024/05/21 06:50
在文章http://blog.csdn.net/taotao4/article/details/42744871中有验证过volatile可见性,早上起来觉得java中常用的同步关键字synchronized没有明确提过是否能保证可见性。猜测synchronized关键字,不能作为可见性的保证,于是修改了上一篇博客的代码验证一下,只是在t1线程中增加了synchronized关键字
代码如下:
package com.easy;public class Main {public static Integer max = 100;public static void main(String[] args){Thread[] threads = new Thread[20];for (int i = 0; i < threads.length; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { while (true) { if(max == null ){ max = 10; System.out.println("已经被重置为null"); } } } }); threads[i].start(); }try {Thread.sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Thread t1 = new Thread(){public void run(){while(true){//System.out.println("重置中");synchronized(this){max = null;}}}};t1.start();}}代码的执行结果是永远看不到“已经被重置”这段话的输出。也就是后面t1线程max=null的结果,对上面thread[i]中每一个线程都不可见。
再次引用文章:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#incorrectlySync
这里提到synchronized会保证对进入同一个监视器的线程保证可见性。比如线程th1修改了变量,退出监视器之前,会把修改变量值v1刷新的主内存当中;当线程t2进入这个监视器时,如果有某个处理器缓存了变量v1,首先缓存失效,然后必须重主内存重新加载变量值v1(这点和volatile很像)。这里语义的解读只是说了对于同一个监视器,变量的可见性有一定的方式可寻,非同一个监视器就不保证了。
本文的代码示例不符合同一个监视器的条件,所以有这不可见也就正常了。
测试平台:
os x 10.10.2
cpu i5
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
0 0
- 关于synchronized是否能保证可见性。
- volatile是否能保证数组中元素的可见性?
- 【并发】volatile是否能保证数组中元素的可见性?
- Synchronized的内存可见性
- java synchronized实现可见性
- synchronized实现可见性过程
- 保证有序性、原子性、可见性
- 由Synchronized的内存可见性说起
- Java内存可见性-synchronized和volatile
- synchronized 的另个一重要作用:内存可见性
- 关于fragment到底是否可见的问题
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- Java是怎么保证原子性,可见性
- volatile 关键字的如何保证内存可见性
- 为什么volatile不能保证原子性而Atomic可以(valatile只保证可见性,不保证原子性)
- 原子性与可见性 volatile与synchronized关键字
- java学习12--线程的可见性,synchronized,volatile使用
- 浅谈Java多线程(synchronized实现可见性)
- android的退出对话框
- tortoise svn无法连接到svn服务器,但用浏览器可以连接到svn服务器之解决方法
- 协同程序
- oracle数据库,当字段值数据过长,截取前几位,然后省略号表示,实例如下。
- smartsvn学习(-)
- 关于synchronized是否能保证可见性。
- AJAX使用反射调用指定类的方法
- 使用iconv进行GBK到BIG5编码转/简繁转换遇到的问题
- 老mac笔记本更换SSD固态硬盘启动失败的解决办法
- Java开发工具IntelliJ IDEA创建Andriod项目
- 4.Struts2_使用XxxAware接口获取web资源
- Android onMeasure、Measure、measureChild、measureChildren 一些简要说明
- poj1157做题心得
- 内存管理(Core Foundation object和Objective - C转换)__bridge,__bridge_retained和__bridge_transfer