两个线程(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 =
最后,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;
} }
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醒来后继续