我有一個(gè)2×2陣列,我有兩個(gè)線程在運(yùn)行.
可以在數(shù)組中使用java中的synchronized語句嗎?
鎖定如何工作? java教程線程說同步語句適用于對(duì)象,所以我不確定它們是什么意思.另一個(gè)網(wǎng)站說我可以發(fā)表一個(gè)聲明
synchronized (array1[]){}
這是否同步訪問數(shù)組中的所有內(nèi)容,以便將數(shù)組鎖定到其他線程?
如果我有一個(gè)二維數(shù)組我可以使用
synchronized(array1 [i])來鎖定數(shù)組的一行?
是否可以鎖定單個(gè)數(shù)組值
喜歡的東西
synchronized (array1[i][j]){}
但是,非常感謝提示或幫助.實(shí)際上我已經(jīng)把它打開了,無論是否正確.但我想知道將來使用
解決方法:
是的,您可以使用數(shù)組作為監(jiān)視器對(duì)象進(jìn)行同步,因?yàn)閿?shù)組(甚至是基元數(shù)組)是Java中的對(duì)象.
您可以在特定監(jiān)視器上同步代碼塊,如下所示:
public void myMethod() { unsynchronized_statements... synchronized(myMonitorObject) { synchronized_statments... }
最佳做法是盡可能少地同步代碼行.
在監(jiān)視器上同步代碼不會(huì)以任何方式影響監(jiān)視器,它只影響訪問同步代碼塊的線程.在線程執(zhí)行可以進(jìn)入代碼塊之前,它必須在監(jiān)視器上獲得“鎖定”. Java運(yùn)行時(shí)確保一次最多一個(gè)線程可以在監(jiān)視器上具有“鎖定”.因此,在數(shù)組上進(jìn)行同步不會(huì)禁止不同步的代碼塊來訪問它!訣竅是確保您不希望同時(shí)發(fā)生的所有操作都在同一監(jiān)視器上同步的塊內(nèi).
由于Java不提供多維數(shù)組,只提供數(shù)組數(shù)組,因此您可以在嵌套數(shù)組上進(jìn)行同步,以實(shí)現(xiàn)更細(xì)粒度的同步.如果將2d數(shù)組建模為行數(shù)組,則只能在行上而不是在列上進(jìn)行同步,因?yàn)樵谠撌纠?列不表示為單獨(dú)的數(shù)組.
如果這些值是非原始值,則只能對(duì)單個(gè)數(shù)組值進(jìn)行同步,因此Integer()而不是int.請(qǐng)注意,Integer()是一個(gè)不可變對(duì)象,因此您無法更改其值.一個(gè)解決方案是使用getter和setter為包含的數(shù)值創(chuàng)建自己的Cell()包裝器對(duì)象.這將允許您讓一個(gè)線程獲取Cell上的鎖并安全地更改其值.
因?yàn)檫@是我的休息日,所以我決定玩得開心,并創(chuàng)建了一個(gè)你所描述的實(shí)例.是的,這是我開心的想法.
類別:
> Matrix:表示2d細(xì)胞矩陣
> Cell:矩陣單元格值的包裝器
> Operation:對(duì)單元格數(shù)組的抽象操作
> IncrementOperation:增加每個(gè)Cell值的操作
> ReverseOperation:一種顛倒細(xì)胞順序的操作
> Main:申請(qǐng)
應(yīng)用程序在同一矩陣上啟動(dòng)多個(gè)操作.唯一的同步代碼塊在類Operation中.如果刪除同步,結(jié)果將是錯(cuò)誤的,因?yàn)閮蓚€(gè)操作同時(shí)操作同一行.
同步輸出:
[105, 104, 103, 102, 101][110, 109, 108, 107, 106][115, 114, 113, 112, 111][120, 119, 118, 117, 116][125, 124, 123, 122, 121][130, 129, 128, 127, 126][135, 134, 133, 132, 131][140, 139, 138, 137, 136][145, 144, 143, 142, 141][150, 149, 148, 147, 146]
NOT同步時(shí)的輸出示例:
[105, 4, 103, 102, 101][110, 9, 108, 207, 106][115, 14, 113, 212, 111][120, 19, 118, 217, 116][125, 124, 123, 122, 121][130, 129, 128, 127, 126][135, 34, 133, 232, 131][140, 139, 138, 137, 136][145, 144, 143, 142, 141][150, 149, 148, 147, 146]
請(qǐng)注意,我在操作實(shí)現(xiàn)中添加了一些Thread.sleep()語句,以使同步和非同步執(zhí)行之間的區(qū)別更加明顯.
來源:https://www.icode9.com/content-1-489051.html聯(lián)系客服