共享和发布对象
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类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他内存操作一起被重排序。
分享到:
相关推荐
Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...
Java并发编程实践-电子书-09章.pdf
《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...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...
《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...
根据提供的信息,我们可以推断出该资源主要关注的是“Java并发编程实践”的相关内容,并且它是一本高清晰度的PDF电子书。虽然提供的链接部分似乎只是重复的网站地址,我们仍可以根据标题、描述以及标签来生成相关的...
Java并发编程---synchronized关键
《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
第16届Jolt大奖提名图书 ...《Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块.....