物件不改變只改變物件的屬性多執行緒執行結果還是同步

2021-08-09 05:39:49 字數 595 閱讀 2190

只要物件不變,即使物件中的屬性被改變了,多個執行緒呼叫物件中的方法時仍是同步的,因為物件不改變多個想成獲取的就是同乙個鎖;

如下**:

public class a

public class b

}}

如果有執行緒1和執行緒2一起呼叫test方法,執行緒1先呼叫,然後再改變類a中的屬性username或num的值後,沒有釋放物件a的鎖這時執行緒2也來呼叫test方法,這時執行緒1和執行緒2是同步的,要等執行緒1釋放物件a的鎖後才能執行;

但注意,如果string類不是屬性時另當別論,如下**:

public class b

}}

這時如果有執行緒1和執行緒2一起呼叫test方法,執行緒1先呼叫,然後改變string類的值後,(如改為"456")即使沒有釋放物件a的鎖這時執行緒2也來呼叫test方法,則執行緒1和執行緒2是非同步的,不需要等執行緒1釋放物件a的鎖線程2就可以執行,這是因為這種情況不是改變了物件的屬性而是改變了物件本身,兩個執行緒獲取的鎖不是同乙個鎖了,所有不再同步了;如果在物件a的只改變之前執行緒2執行到了test方法時,這時由於物件a沒有改變,所有獲取的是同乙個鎖,則執行緒1和執行緒2是同步的。

刪除物件屬性, 改變原物件或不改變原物件

一 用處 刪除物件的屬性 eg var person delete person.name console.log person 結果 二 注意事項 1 不可以刪除用var const定義的變數 注 是指物件裡的屬性,不是指該物件不能用var 或 const。eg var a 123 或 const...

複製物件重新賦值不改變原物件

直接賦值 varobj1 varobj2 obj1 console.log obj2 通過 object.assign 這個屬性來進行複製 varobj varobj2 object.assign obj console.log obj2 通過 for in 迴圈賦值 varobj1 c 0 var...

JS監聽物件屬性改變

設想這麼乙個需求 user.name 張三 對user資料進行操作的時候,同步的修改頁面上的使用者名為張三。這就是個資料繫結的概念。針對這類需求 es5提供了object.defineproperty函式 使用方式如下所示 1 object.defineproperty user,name 56 但...