package com.test1; public classDthread { public static void main(String[] args) { // TODO Auto-generated method stub Test1t1 = newTest1(); Threadth0 = newThread(t1); Threadth1 = newThread(t1); th0.start(); th1.start(); } } class Test1 implements Runnable{ private int a=0; @Override public void run() { // TODO Auto-generated method stub //下面代码有线程安全问题 a = a + 1; System.out.println(Thread.currentThread().getName()+ "A="+ a); // for(inti=0;i<20;i++){ // a= a + 1; // System.out.println(Thread.currentThread().getName()+ "A=" + a); // } }
} 程序输出的几种结果: (1) Thread-0A=1//这种结果10次出现一次,运气好100次出现一次 Thread-1A=1//此结果很奇怪,不应该出现这种问题。需要多次运行才会出现 (2) Thread-0A=1 Thread-1A=2 (3) Thread-0A=2 Thread-1A=2 (4) Thread-0A=2 Thread-1A=1 第(1)种结果很匪夷所思,有线程安全问题,也不应该出现这种数据。两个线程都会执行一次加法,数据是共享的,应该至少有一个线程输出A=2.似乎少计算了一次. 用注释中的for循环输出也会出现这种问题,但只会在开始时都输出A=1,最后结果也只会少计算一次。 我猜测a=a+1这一步是同时进行的,两线程运算时拿到的a都等于0,重复了一次a=0+1.又或者是双核CPU的原因??? 我想知道这种问题到底是怎么出现的? 截图:
|