代码如下:
public class Demo02 {
public static void main(String[] args) {
Demo02Service service = new Demo02Service();
Thread threadA = new Demo02ThreadA(service);
Thread threadB = new Demo02ThreadB(service);
threadA.start();
threadB.start();
}
}
class Demo02Service{
private int num;
public void add(String userName){
if(Objects.equals("a",userName)){
num=100;
System.out.println("a is set");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else
{
num=200;
System.out.println("b is set");
}
System.out.println("userName="+userName+", num="+num);
}
}
class Demo02ThreadA extends Thread{
private Demo02Service service;
public Demo02ThreadA(Demo02Service service){
this.service=service;
}
@Override
public void run() {
service.add("a");
}
}
class Demo02ThreadB extends Thread{
private Demo02Service service;
public Demo02ThreadB(Demo02Service service){
this.service=service;
}
@Override
public void run() {
service.add("b");
}
}运行结果:
预期结果应该是userName=a时,num=100;说明线程A在睡眠的时候,num值在B线程中被修改了。产生了脏读。如果想要线程同步进行的话,可以在方法加上synchronized锁。

京公网安备 11010502036488号