java内存模型学习笔记
2016-11-06 20:59
183 查看
1·数据争用问题。
光看图可能很难理解什么意思,这里表示的是程序可能执行的两种顺序,我们一般会觉得a这种情况是正确的程序执行方式,但是在多线程的程序中,a和b这种情况都有可能出现,还可能出现别的情况,这就出现了数据争用的问题。
我写了一个测试程序来说明这种情况。
代码:
我们来看这段代码执行几次的结果和输出记录:
1。
2。
要重现上图中的效果还是比较困难,但上面两种结果就足以说明这段程序是有数据争议的,在两个线程同时运行时,就会出现无法预期的结果。
光看图可能很难理解什么意思,这里表示的是程序可能执行的两种顺序,我们一般会觉得a这种情况是正确的程序执行方式,但是在多线程的程序中,a和b这种情况都有可能出现,还可能出现别的情况,这就出现了数据争用的问题。
我写了一个测试程序来说明这种情况。
代码:
package com.test; import java.util.concurrent.locks.ReentrantLock; /** * Created by zhongzhong on 2016/11/6. */ public class LockDemo { public static int x = 0; public static int y = 0; public static int r = -1; public static int r2 = -2; ReentrantLock lock = new ReentrantLock(); class Thread1 implements Runnable{ public void run() { System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t1--->start"); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); x = 1; System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t1--->x=1 end."); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t1--->lock start."); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); lock.lock(); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t1--->y=1 start."); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); y = 1; System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t1--->y=1 end."); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); lock.unlock(); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t1--->unlock end."); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); } } class Thread2 implements Runnable{ public void run() { System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t2--->start"); System.out.println("t2--->lock start."); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); lock.lock(); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t2--->r=y start."); r=y; System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t2--->r=y end."); lock.unlock(); System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t2--->unlock end."); System.out.println("t2--->r2=x start."); r2=x; System.out.println("x="+x+",y="+y+",r="+r+",r2="+r2); System.out.println("t2--->r2=x end."); } } public void test(){ new Thread(new Thread1()).start(); new Thread(new Thread2()).start(); } public static void main(String[] args) { new LockDemo().test(); } }
我们来看这段代码执行几次的结果和输出记录:
1。
x=0,y=0,r=-1,r2=-2 t1--->start x=0,y=0,r=-1,r2=-2 x=1,y=0,r=-1,r2=-2 t1--->x=1 end. x=1,y=0,r=-1,r2=-2 t1--->lock start. x=1,y=0,r=-1,r2=-2 x=1,y=0,r=-1,r2=-2 t1--->y=1 start. x=1,y=0,r=-1,r2=-2 t2--->start t2--->lock start. x=1,y=0,r=-1,r2=-2 x=1,y=0,r=-1,r2=-2 x=1,y=1,r=-1,r2=-2 t1--->y=1 end. x=1,y=1,r=-1,r2=-2 x=1,y=1,r=-1,r2=-2 t1--->unlock end. x=1,y=1,r=-1,r2=-2 t2--->r=y start. x=1,y=1,r=1,r2=-2 t2--->r=y end. x=1,y=1,r=1,r2=-2 t2--->unlock end. t2--->r2=x start. x=1,y=1,r=1,r2=1 t2--->r2=x end. x=1,y=1,r=-1,r2=-2
2。
x=0,y=0,r=-1,r2=-2 t1--->start x=0,y=0,r=-1,r2=-2 x=1,y=0,r=-1,r2=-2 t1--->x=1 end. x=1,y=0,r=-1,r2=-2 t1--->lock start. x=1,y=0,r=-1,r2=-2 x=1,y=0,r=-1,r2=-2 t1--->y=1 start. x=1,y=0,r=-1,r2=-2 x=1,y=1,r=-1,r2=-2 t1--->y=1 end. x=1,y=1,r=-1,r2=-2 x=1,y=1,r=-1,r2=-2 t1--->unlock end. x=1,y=1,r=-1,r2=-2 x=1,y=1,r=-1,r2=-2 t2--->start t2--->lock start. x=1,y=1,r=-1,r2=-2 x=1,y=1,r=-1,r2=-2 t2--->r=y start. x=1,y=1,r=1,r2=-2 t2--->r=y end. x=1,y=1,r=1,r2=-2 t2--->unlock end. t2--->r2=x start. x=1,y=1,r=1,r2=1 t2--->r2=x end
要重现上图中的效果还是比较困难,但上面两种结果就足以说明这段程序是有数据争议的,在两个线程同时运行时,就会出现无法预期的结果。
相关文章推荐
- JVM学习笔记——java内存模型与线程(2)
- java内存模型---学习笔记
- Java多线程设计模式学习笔记 - Java内存模型
- JVM学习笔记之java内存模型
- 学习笔记二:Java内存模型以及happens-before规则
- 【Java并发编程的艺术】【学习笔记】Java内存模型(JMM)
- JVM学习笔记(一)——Java内存模型
- JVM学习笔记1-JAVA内存模型概念
- Java内存模型(JMM)学习笔记
- Java内存模型学习笔记
- 学习笔记之Java线程安全杂谈(中)——Java内存模型、happens-before原则和DCL问题
- Win32学习笔记 第二章 Unicode
- PE学习笔记(一)
- Win32学习笔记 第三章 HelloWin
- 开发asp.net自定义控件(asp.net学习笔记五)
- Win32学习笔记 第四章 输出文本_2
- Microsoft Agent 学习笔记 (一)
- STL的学习笔记之一
- 《Mastering Delphi 6》学习笔记之七
- 开发asp.net自定义控件(asp.net学习笔记四)