多线程案例收集

案例1:value++导致的不安全序列

public class UnsafeSequence implements Runnable{
    protected int countDown = 10;
    private int value = 0;
    
    /**
     * 这里的value++事实上包含3步操作,读取value,给value+1,写入value。
     * 并发操作的时候,可能会同时读取,因此可能会返回相同的值,因此不是线程安全的,方法上加synchronized才行。 
     */
    public int getNext(){
        int x = value;
        Thread.yield();//为了让效果更明显,调用yield方法,主动让出进程
        x = x+1;
        value = x;
        return value;
//        return value++;//这段代码效果等同于上面这段代码(但是本地运行不出这种效果),所以是线程不安全的
    }

    @Override
    public void run() {
        while(countDown-- >0){
            System.out.println(Thread.currentThread().getName()+":"+getNext());
        }
    }
    
    public static void main(String[] args) {
        UnsafeSequence us = new UnsafeSequence();
        Thread t1 = new Thread(us,"t1");
        Thread t2 = new Thread(us,"t2");
        t1.start();
        t2.start();
    }

}

 

posted @ 2015-05-26 12:18  系统攻城狮  阅读(173)  评论(0编辑  收藏  举报