前面说了如何管理对共享、易变状态的数据的状态的访问,《JAVA并发编程》第三章主要介绍共享和发布可以被多线程安全访问的对象,使用了java.util.concurrent包下的类为基础,创建线程安全的类和构建安全的并发应用程序。
synchronized不仅仅与操作原子性和关键区域定界相关,它还有个重要却不明显的作用——内存可见性。同步不仅仅是防止线程修改正在被别的线程使用的对象状态,还可以保证当一个线程修改了对象状态后,其他线程可以看到状态的更新。通过显示的同步或利用内置的同步的类库,可以保证发布的对象是线程安全的。
可见性
当一个线程对对象状态进行读操作,另一个线程对该对象状态进行写操作时,如果没有线程同步,则无法保证读对象的线程能即时的读取到写对象更新后的值。
package com.zyp.test.concurrent; public class NoVisibility { private static boolean ready;//默认值为false private static int number; private static class ReaderThread extends Thread { public void run() { while (!ready) Thread.yield(); System.out.println(number); } } public static void main(String[] args) { new ReaderThread().start(); number = 42; ready = true; System.out.println("end"); } }
这段代码中有两个线程,一个主线程和一个读线程都要反问number和ready。主线程启动读线程后,将ready置为true。读线程一直循环,直到发现ready为true后,打印number的值。看起来读线程打印结果:
1:可能是明显的42,
2:也可能打印出0,
3:也可能永远不停止。
因为没有适当的同步,不能保证主线程写了number和ready一定对读线程是可见的。上面读线程可能永远不停止,因为ready可能对读线程永远不可见。上面可能打印出0,跟重排序有关。
重排序(reordering):在一个线程中的方法的执行顺序并不保证与代码中顺序一致。在没有同步的情况下,java内存模型(JMM)允许编译器重新排序操作,以获取多处理器带来的更多好处。
重排序后,编译器后的代码可能先执行ready的赋值再执行number的赋值。
相关推荐
多线程编程之三——线程间通讯
通用线程——sed实例(中文版).pdf
python进程、线程(csdn)————程序
并发编程——认识java里的线程(csdn)————程序
线程,同步与锁————Lock你到底锁住了谁?.htm
python实现线程池并可自动拓展和减小线程数(csdn)————程序
【c++】48.g++编译opencv、多线程(csdn)————程序
该文件中实例说明了如何在Labwindows/cvi中使用线程锁和线程安全变量进行多线程程序设计
第11章 实例257——使用Win32 ... 实例274——三种方法实现启动其他的应用程序 实例275——使用剪贴板实现程序间的数据交换 实例276——通过内存映射实现进程间的数据交换 实例277——通过消息机制实现进程间的通信
C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例
1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled
软件界面上点“创建线程” 按钮,创建三个生产者线程(P1,P2,P3)和两个消费者线程(C1,C2),生产者和消费者线程共享一个长度为2KB的环型公共缓冲区,生产者向其中投放消息,消费者从中取走消息。只要缓冲区未满...
易语言实例模块——多线程模块.e
多线程编程之四——线程的同步
线程安全队列的接口文件如下: #include template class threadsafe_queue { public: threadsafe_queue(); threadsafe_queue(const threadsafe_queue&); threadsafe_queue& operator=(const threadsafe_queue&...
java多线程处理数据(csdn)————程序
简单多线程实例。简单多线程实例。简单多线程实例。简单多线程实例。简单多线程实例。
Java 语法总结——线程Java 语法总结——线程Java 语法总结——线程Java 语法总结——线程
线程——基本线程的应用和线程调用控件线程——基本线程的应用和线程调用控件