package cha02.execise02;
/**
* Created by sunyifeng on 17/9/20.
*/
public class HasSelfPrivateNum {
private int num = 0;
public void addI(String username) {
try {
if (username.equals("a")) {
num = 100;
System.out.println("a set over:" + num);
Thread.sleep(2000);
} else {
num = 200;
System.out.println("b set over:" + num);
}
System.out.println(username + " num = " + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package cha02.execise02;
/**
* Created by sunyifeng on 17/9/20.
*/
public class ThreadA extends Thread {
private HasSelfPrivateNum numRef;
public ThreadA(HasSelfPrivateNum numRef){
super();
this.numRef = numRef;
}
@Override
public void run(){
super.run();
numRef.addI("a");
}
}
package cha02.execise02;
/**
* Created by sunyifeng on 17/9/20.
*/
public class ThreadB extends Thread {
private HasSelfPrivateNum numRef;
public ThreadB(HasSelfPrivateNum numRef){
super();
this.numRef = numRef;
}
@Override
public void run(){
super.run();
numRef.addI("b");
}
}
package cha02.execise02;
/**
* Created by sunyifeng on 17/9/20.
*/
public class Run {
public static void main(String[] args) {
HasSelfPrivateNum numRef = new HasSelfPrivateNum();
//
ThreadA threadA = new ThreadA(numRef);
threadA.start();
//
ThreadB threadB = new ThreadB(numRef);
threadB.start();
}
}
运行结果:
a set over:100
b set over:200
b num = 200
a num = 200
程序分析:
1、多个线程访问一个对象的实例变量,则可能出现“脏读”(非线程安全)。
2、多个线程访问一个不同步的方法时,则可能出现“脏读”(非线程安全)。
在方法前,加入synchronized之后即可同步。
synchronized public void addI(String username) { try { if (username.equals("a")) { num = 100; System.out.println("a set over:" + num); Thread.sleep(2000); } else { num = 200; System.out.println("b set over:" + num); } System.out.println(username + " num = " + num); } catch (InterruptedException e) { e.printStackTrace(); } }