跟着实例学习java多线程4-内存可见性
2015-02-01 14:59
393 查看
前三篇我们主要说了多线程访问共享可变状态时需要进行正确的同步处理,保证同一时刻只有一个线程访问相同的数据,我们使用synchronized关键字来实现原子性操作。今天我们在来认识一下同步的另一个重要方面:内存可见性,这个概念其实很好理解,就是保证在同一个时刻,共享可变状态对访问它的线程呈现出自己最新的状态变化。我们经常遇到的情景是这样的,一个全局变量计数器,一个线程负责更新该数值,另一些线程获取这个值,那么可见性就是获取值的线程,可以获取到更新线程更新的最新的值。让我们先来看一个例子,在没有做同步的情况下会发生什么。
package com.home.thread; /** * @author gaoxu * */ public class ThreadStart { static boolean ready ; static int number; private static class ReaderThread extends Thread{ public void run(){ number = 1; } } private static class ReaderThread1 extends Thread{ public void run(){ if(ready){System.out.println("="+number);} } } public static void main(String[] para){ new ReaderThread().start(); ready = true; new ReaderThread1().start(); } }以上这段代码的运行结果可能会呈现出以下的结果:第一种:
=0第二种
=1这其中只有第二种是我们想要看到的结果。我们把第一种情况现象叫做“重排序”,重排序现象往往会产生无效数据,第一行情况就是一个无效数据,解决这种现象就必须采用同步加锁机制。(当然还有volatile变量,以后我们会重点说一下)下面我们看一下如何实现一个线程安全的可变整数类。
package com.home.thread;/*** @author gaoxu**/
@safepublic class SafeThread {static int number;@safepublic static synchronized int getNumber() {return number;}@safepublic static synchronized void setNumber(int number) {SafeThread.number = number;}}
package com.home.thread;/*** @author gaoxu**/public class ThreadStart {private static class ReaderThread extends Thread{public void run(){SafeThread.setNumber(1);}}private static class ReaderThread1 extends Thread{public void run(){System.out.println("="+SafeThread.getNumber());}}public static void main(String[] para){new ReaderThread().start();new ReaderThread1().start();}}加锁后我们会看到输出结果永远是 1了。让我们总结一下加锁同步的含义:加锁的含义不仅仅局限于原子操作行为,还可以保证内存可见性。当然最重要的一点是多个读写线程必须是保证都在同一个锁上同步的操作可变状态变量。我们现在了解完了同步的主要特性,互斥性和可见性。可是我们知道同步对性能的影响是非常大的,那么我们该怎么样平衡呢?
相关文章推荐
- 跟着实例学习java多线程5-初识volatile变量
- 跟着实例学习java多线程10-定时任务实例Quartz等
- 跟着实例学习java多线程6-如何正确发布线程安全的对象
- 跟着实例学习java多线程8-同步容器类的问题
- Java学习1:图解Java内存分析详解(实例)
- java多线程之内存可见性学习笔记
- 跟着实例学习java多线程2-synchronized锁住的是对象还是代码
- 跟着实例学习java多线程9-并发容器
- java内存可见性学习笔记
- Java学习笔记--Volatile关键字和内存可见性
- java多线程之内存可见性学习笔记
- 【学习笔记】慕课网——Java多线程之内存可见性
- 跟着实例学习java多线程7-对象的组合发布
- 跟着实例学习java多线程3-synchronized的多种写法有何区别?
- 跟着实例学习java多线程1-为什么使用?
- 关于Java中String内存的学习
- java内存学习笔记-------易筋经
- 通过实例学习Java对象的构造过程
- Java Socket套接字应用实例-java学习笔记(1)
- java_croe 学习笔记之新IO---java.nio 之内存映射文件