线程同步机制-成员变量不是线程安全的
代码如下:
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锁。