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) { }