Thread a = new Thread(thread, "A"); //a线程调用的是thread对象的run方法
Thread b = new Thread(thread, "B"); //b线程调用的也是thread对象的run方法
两个线程使用的都是同一个thread对象,所以两个线程之间相互产生影响
Thread b = new Thread(thread, "B"); //b线程调用的也是thread对象的run方法
两个线程使用的都是同一个thread对象,所以两个线程之间相互产生影响
第一,线程a和线程b同时使用thread对象,当线程a退出同步块后,i的值变成5
第二,由于同步块对变量的i的改变对其他线程可见,效果比volatile稍强,故其他线程也能看到这个值已经发生改变的值。
因为两个线程同时操作一个对象的同一个状态(这里是i),所以需要加同步块。
是的,你测试的不对,都是对同一个thread操作。package com.cybersoft.dsan.test;
public class JavaTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("main start");
MyThread aa = new MyThread("A");
MyThread bb = new MyThread("B");
Thread a = new Thread(aa);
Thread b = new Thread(bb);
a.start();
b.start(); System.out.println("main end");
}}class MyThread implements Runnable {
private String threadName;
public MyThread(String threadName){
this.threadName = threadName;
}
private int i = 0; @Override
public void run() {
// TODO Auto-generated method stub
System.out.println(threadName + " run enter i = "
+ i);
synchronized (this) {
System.out.println(threadName
+ " synchronized >>>>>>> i = " + i);
for (; i < 5; i++) {
// for (i = 0; i < 5; i++) {
System.out.println(threadName
+ " synchronized loop " + i);
}
} System.out.println(threadName + " run exit");
}
}改成类似于上面,就应该i的值不会相互影响。
现在终于明白了。多谢。