下面是我对线程同步的理解:
线程同步这个技术是在当同一块资源或者代码块被多个线程访问或调用,举个例子,当线程A和线程B同时访问了同一个全局变量 var1的话,假设 var1 的值为 5, 那么线程A 和 线程B 以 var1 必须大于0为条件同时开始对 var1 变量做减法操作,那么可能会出现当变量 var1 为 0时,可能线程A 或线程B 仍然在对变量 var1 进行减法操作,此时便有可能出现变量 var1 的值超出预期范围的情况发生.
我自己写了个程序实验了一下,运行了很多次,没有出现过我刚才说的那种超出预想结果的情况。
请问各位对这个情况怎么理解呢?又或者说我对线程同步的理解有误?

解决方案 »

  1.   

    发下你的程序看看呢 我写了个测试的会出现-1的情况。public class Test { public static void main(String[] args) throws Exception {

    new Thread(new TestThread()).start();
    new Thread(new TestThread()).start();
    }
    }class TestThread implements Runnable {
    private static int i=10;
    public void run() {
    while(i>0){
    try {
    Thread.sleep(1);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    i--;
    System.out.println(Thread.currentThread().getId()+":"+i);
    }
    }
    }
      

  2.   

    在弄个同步的测试,你对比下看看哦。public class Test { public static void main(String[] args) throws Exception { new Thread(new TestThread()).start();
    new Thread(new TestThread()).start();
    new Thread(new TestThread()).start();
    }
    }class TestThread implements Runnable {
    private static int i = 10; public void run() {
    while (i > 0) {
    synchronized (TestThread.class) {
    if(i>0)
    System.out.println(Thread.currentThread().getId() + ":" + i);
    i--;
    }
    }
    }
    }
      

  3.   

    我自己刚才也重新做了一些测试,明白了一些,以前对线程同步以及多线程下的数据安全老是用不好,由于demo的测试时间一般较短,发生错误的几率较低,所以经常会产生一些迷惑。像你给的代码中的情况(如下):        new Thread(new TestThread()).start();
            new Thread(new TestThread()).start();上面的代码中由于三个线程在并行运行,虽然在宏观上是并行运行的,但从输出的效果来看,还是一个一个运行的,只不过是在等待时间,当线程A运行完成之后变量 i 的已经为 0 了,但是由于线程B 还没有运行完,此时线程B会继续对变量 i 进行操作,结果就出现 -1了。应该是这么理解的吧,这些微观上的东西理解起来真费劲,只能怪自己以前操作系统没好好学了
      

  4.   

    明白,这是个概率问题,如果一个任务执行时间越长,那么造成错误的几率就会越大。昨天我在写demo时候发现一但增加线程的数量或者运行时间就很容易出错