java双线程调用同一个对象+锁

两个线程(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醒来后继续

posted @ 2015-11-08 22:13  Gabyler  阅读(910)  评论(0编辑  收藏  举报