Thread a = new Thread(thread, "A"); //a线程调用的是thread对象的run方法
Thread b = new Thread(thread, "B"); //b线程调用的也是thread对象的run方法
两个线程使用的都是同一个thread对象,所以两个线程之间相互产生影响

解决方案 »

  1.   

    有两点:
    第一,线程a和线程b同时使用thread对象,当线程a退出同步块后,i的值变成5
    第二,由于同步块对变量的i的改变对其他线程可见,效果比volatile稍强,故其他线程也能看到这个值已经发生改变的值。
    因为两个线程同时操作一个对象的同一个状态(这里是i),所以需要加同步块。
      

  2.   


    是的,你测试的不对,都是对同一个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的值不会相互影响。
      

  3.   

    多谢各位,正如楼上几位说的我操作的是同一个对象thread的i成员,所以值会互相影响。
    现在终于明白了。多谢。