下面是我对线程同步的理解:
线程同步这个技术是在当同一块资源或者代码块被多个线程访问或调用,举个例子,当线程A和线程B同时访问了同一个全局变量 var1的话,假设 var1 的值为 5, 那么线程A 和 线程B 以 var1 必须大于0为条件同时开始对 var1 变量做减法操作,那么可能会出现当变量 var1 为 0时,可能线程A 或线程B 仍然在对变量 var1 进行减法操作,此时便有可能出现变量 var1 的值超出预期范围的情况发生.
我自己写了个程序实验了一下,运行了很多次,没有出现过我刚才说的那种超出预想结果的情况。
请问各位对这个情况怎么理解呢?又或者说我对线程同步的理解有误?
线程同步这个技术是在当同一块资源或者代码块被多个线程访问或调用,举个例子,当线程A和线程B同时访问了同一个全局变量 var1的话,假设 var1 的值为 5, 那么线程A 和 线程B 以 var1 必须大于0为条件同时开始对 var1 变量做减法操作,那么可能会出现当变量 var1 为 0时,可能线程A 或线程B 仍然在对变量 var1 进行减法操作,此时便有可能出现变量 var1 的值超出预期范围的情况发生.
我自己写了个程序实验了一下,运行了很多次,没有出现过我刚才说的那种超出预想结果的情况。
请问各位对这个情况怎么理解呢?又或者说我对线程同步的理解有误?
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);
}
}
}
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--;
}
}
}
}
new Thread(new TestThread()).start();上面的代码中由于三个线程在并行运行,虽然在宏观上是并行运行的,但从输出的效果来看,还是一个一个运行的,只不过是在等待时间,当线程A运行完成之后变量 i 的已经为 0 了,但是由于线程B 还没有运行完,此时线程B会继续对变量 i 进行操作,结果就出现 -1了。应该是这么理解的吧,这些微观上的东西理解起来真费劲,只能怪自己以前操作系统没好好学了