java實現(xiàn)線程安全的三種方法 list線程怎么變安全的?
list線程怎么變安全的?1.所有操作方法同步,保證線程安全。2.(list)同步的代碼塊還用來包裝原列表的操作,實現(xiàn)線程安全。3.閱讀和寫作的思路是分離的,寫作是鎖定的,閱讀是解鎖的。寫的時候鎖(使
list線程怎么變安全的?
1.所有操作方法同步,保證線程安全。
2.(list)同步的代碼塊還用來包裝原列表的操作,實現(xiàn)線程安全。
3.閱讀和寫作的思路是分離的,寫作是鎖定的,閱讀是解鎖的。寫的時候鎖(使用lock),復制原數(shù)組(并且數(shù)組長度為1,將數(shù)組的最后一個元素賦值為要添加的元素),然后更新數(shù)組的引用,解鎖。
static和Volatile的區(qū)別?
變量放在主存區(qū),每個使用該變量的線程都會從主存區(qū)拷貝一份到自己的工作區(qū)進行操作。
Volatile,說明這個字段是可變的(可能被多個線程使用),Java內(nèi)存模型負責保持每個線程的工作區(qū)中這個字段的值與主存區(qū)同步,也就是一致性。
Static,說明這個字段是靜態(tài)的(可能被多個實例共享),這個類的所有實例的字段在主存區(qū)都是同一個變量,也就是唯一性。
Volatile,聲明變量值的一致性;靜態(tài)的,聲明變量的唯一性。
另外,volatile同步機制不同于synchronized,前者是內(nèi)存同步,后者不僅包括內(nèi)存同步(一致性),還保證線程互斥(互斥)。
Static只聲明變量在主存中的唯一性,不能保證工作區(qū)和主存變量值的一致性;除非變量的值是不可變的,也就是用final這個修飾符,否則static聲明的變量不是線程安全的。
以下摘自Java語言規(guī)范的官方解釋:
1)如果一個字段被聲明為靜態(tài)的,那么無論最終創(chuàng)建了多少個(可能是零個)類實例,該字段都只存在一個實例。
2)一個字段可能被聲明為volatile,在這種情況下,Java內(nèi)存模型確保所有線程都看到該變量的一致值。