public class Point { private double x, y;//內部定義表示座標點 private final StampedLock s1 = new StampedLock();//定義了StampedLock鎖, void move(double deltaX, double deltaY) { long stamp = s1.writeLock();//這裏的含義和distanceFormOrigin方法中 s1.readLock()是相似的 try { x += deltaX; y += deltaY; } finally { s1.unlockWrite(stamp);//退出臨界區,釋放寫鎖 } } double distanceFormOrigin() {//只讀方法 long stamp = s1.tryOptimisticRead(); //試圖嘗試一次樂觀讀 返回一個相似於時間戳的郵戳整數stamp 這個stamp就能夠做爲這一個所獲取的憑證 double currentX = x, currentY = y;//讀取x和y的值,這時候咱們並不肯定x和y是不是一致的 if (!s1.validate(stamp)) {//判斷這個stamp是否在讀過程發生期間被修改過,若是stamp沒有被修改過,責任無此次讀取時有效的,所以就能夠直接return了,反之,若是stamp是不可用的,則意味着在讀取的過程當中,可能被其餘線程改寫了數據,所以,有可能出現髒讀,若是若是出現這種狀況,咱們能夠像CAS操做那樣在一個死循環中一直使用樂觀鎖,知道成功爲止 stamp = s1.readLock();//也能夠升級鎖的級別,這裏咱們升級樂觀鎖的級別,將樂觀鎖變爲悲觀鎖, 若是當前對象正在被修改,則讀鎖的申請可能致使線程掛起. try { currentX = x; currentY = y; } finally { s1.unlockRead(stamp);//退出臨界區,釋放讀鎖 } } return Math.sqrt(currentX * currentX + currentY * currentY); } }
while (pred.locked) { }