两个线程(Thread)调用同一个对象(使用Runnable接口的对象ThreadJob)
误区:下一个线程会从上一个线程结束的地方开始
正解:如
public domd implements Runnable{ int blance = 0; public void run{ for(int i = 0; i < 50; i++){ blance++; } } } domd runner = new domd(); Thread t = new Thread(runner); Thread t =
View Code
最后,balance一定被改成100
注意:
class TestSync implements Runnable{ int balance; public void run{ for(int i = 0; i < 20; i++){ increment(); } } public void increment{ int i = balance; balance = i + 1; } }
View Code
i = balance;
balane = i + 1
当A线程在i = balance停下来sleep(),假如i被赋值为5
B线程让i被赋值为5,接着把balance改成6
继续改成7
当A线程醒来,继续刚才i=5,接着balance被改成6
//出现覆盖
因此,解决办法:锁(synchronized 原子化–不可分割)
对一个方法public synchronized void increment()
能保证A线程即使sleep(),B线程也无法存取该对象,A醒来后继续