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