`
zds625
  • 浏览: 10979 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类

java并发编程实践---共享对象(随笔)

    博客分类:
  • Java
阅读更多
共享和发布对象
synchronized关键字可用于原子操作或者划定“临界区”,还有一个重要的方面:内存可见性,我们希望当一个线程修改了对象状态后,其他的线程能够真正看到改变。而这个可用同步来实现。
可见性
当读线程和写线程分别发生在不同的线程的时候,对于状态的值来说不能确保读线程及时的读取其他线程写入的值。为了确保跨线程写入的内存可见性,必须使用同步机制。
过期数据:一种由于没有恰当使用同步而引起的过期的值。

public class Novisibility {
    private static boolean ready;
    private static int number;
    private static class ReadThread extends Thread {
      public void run() {
        while (!ready)
            Thread.yield();
       System.out.println(number);
      }
    }
   public static void main(String [] arg) {
       new ReadThread().start();
       number = 42;
       ready = true;
   }
}

以上例子在没有同步的情况下运行了两个线程:main方法的主线程和ReadThread线程,从程序上我们认为会输出42,但事实上,它可能输出0,或者根本不会终止。因为没有使用同步不能确保主线程写入ready和number的值对ReadThread线程是可见的。
重排序现象
在单个线程中,只要重排序不会对结果产生影响,那就不保证其中的操作一定按照程序写定的顺序执行---即使重排序对于其他线程来说会产生明显的影响。
在上面的例子,主线程在没有同步的情况下执行,读线程看到的顺序可能与发生写入的顺序正好相反或者完全不同。
所以,只要数据需要被跨线程共享,就需要进行恰当的同步。

非原子的64位操作
过期值确保了线程得到一个真实的数值而不是凭空而来的值,这样的安全保证被称为最低限的安全性,最低限的安全性应用于所有的变量,除了,没有声明为volatile的64位数值变量(double和long),jvm将64位非volatile的double和long变量的读或者写分为两个32位操作,如果读和写发生在不同的线程,那么读取非volatile类型的long和double就可能出现一个值是高32位和另一个值是低32位。因此即使不关心过期值,但在多线程程序中使用共享的、可变的long和double变量也可能是不安全的。除非将它们声明为volatile,或者用锁保护起来。

volatile变量:一种同步的弱形式,确保变量的更新以可预见的方式告诉其他线程,当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他内存操作一起被重排序。
分享到:
评论
1 楼 zhuorulin 2011-02-28  
重排序。 

相关推荐

    Java并发编程实践-电子书

    Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...

    Java并发编程实践-电子书-09章.pdf

    Java并发编程实践-电子书-09章.pdf

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是Java开发人员深入理解并发编程的一本经典著作,由Doug Lea撰写,本书中文版高清完整,包含丰富的书签,便于读者查阅和学习。这本书旨在帮助开发者掌握在Java平台上进行高效、安全并发编程的...

    62-Java并发编程实战

    62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...

    Java并发编程实践--电子书.rar

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...

    Java并发编程实践-电子书1-9章pdf

    《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...

    JAVA并发编程实践-

    根据提供的信息,我们可以推断出该资源主要关注的是“Java并发编程实践”的相关内容,并且它是一本高清晰度的PDF电子书。虽然提供的链接部分似乎只是重复的网站地址,我们仍可以根据标题、描述以及标签来生成相关的...

    Java并发编程---synchronized关键字

    Java并发编程---synchronized关键

    JAVA并发编程实践-cn.pdf

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    JAVA并发编程实践-中文-高清

    第16届Jolt大奖提名图书 ...《Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块.....

Global site tag (gtag.js) - Google Analytics