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

两个线程(Thread)调用同一个对象(使用Runnable接口的对象ThreadJob)

误区:下一个线程会从上一个线程结束的地方开始

正解:如

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

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

注意:

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

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醒来后继续

    原文作者:Gabyler
    原文地址: http://www.cnblogs.com/gabygoole/p/4948543.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞