在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  Linux/ 關(guān)于多線程,復(fù)合操作的一個(gè)小問題

關(guān)于多線程,復(fù)合操作的一個(gè)小問題

大家好,我在看一篇文章的時(shí)候,內(nèi)容提到

“單個(gè)方法的原子性,并不能保證 復(fù)合操作 也具有原子性”

請(qǐng)問這句話中的復(fù)合操作是什么意思,能舉個(gè)例子說明嗎?

謝謝大家

回答
編輯回答
旖襯

參考這篇文章,我來翻譯一下:

這是一個(gè)方法,它具有原子性:

    public int getVector() {
        int index = vector.size() - 1;
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return vector.get(index);
    }

這也是一個(gè)方法,它也具有原子性:

    public void deleteVector() {
        int index = vector.size() - 1;
        vector.remove(index);
    }

所謂原子性,就是方法里的語句會(huì)順次執(zhí)行,不會(huì)被打斷。

但是你把它倆復(fù)合起來,它就不再是原子的了:

    public static void main(String[] args) {
        VectorTest vectorTest = new VectorTest();
        new Thread(new Runnable() {
            public void run() {
                vectorTest.getVector();
            }
        }).start();
        new Thread(new Runnable() {
            public void run() {
                vectorTest.deleteVector();
            }
        }).start();
    }

在這里開了兩個(gè)線程,一個(gè)執(zhí)行第一個(gè)方法,另一個(gè)執(zhí)行第二個(gè)方法,第一個(gè)方法一上來先獲取了向量的尺寸,然后就開始休眠了,趁第一個(gè)方法不注意,第二個(gè)方法進(jìn)來刪除了向量里最后一個(gè)元素,等第一個(gè)方法醒過來,再想找最后一個(gè)元素找不著了,就拋出錯(cuò)誤了,所以復(fù)合操作不具有原子性,中間被插入打斷了。

解決的方法就是加個(gè)鎖:

    public int getVector(){
        synchronized (vector) {
            int index = vector.size() - 1;
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return vector.get(index);
        }
    }

synchronized就是同步的意思,同步的意思是說這一步邁不完,下一步不能開始,所以這樣就保證了整個(gè)操作依然是原子級(jí)的,不存在被插入的可能。

2018年3月31日 22:52