资料来源:
https://www.liaoxuefeng.com/wiki/1252599548343744/1309138673991714
package com.zoe.demo;
import java.util.concurrent.locks.StampedLock;
/**
* 这个是readwrite升级版本,
* 它升级的意思是说,绝大部分时候我们是在读数据,很少时间我们在写数据,
* 所以我们大可不必在每次读的时候给上锁。所以才有了这个。
* 写的时候上锁,读的时候,不上锁(乐观锁),先验证一个版本,每次写的时候这个版本会改变,如果没写这个版本还是和一次一样。
* 所以只要验证这一块,如果发现不一致,就重新加一个悲观锁,这时候写的线程操作无法进去,只能等这边重新获取数据更正完之后放开锁。其他写的线程才能操作。
*
* */
public class DemonStampedLock {
public static void main(String[] args) {
Point p=new Point();
long sleepTime[]={100,200};
for (int i = 0; i < 100; i++) {
int finalI = i;
var threadMove = new Thread("move" + finalI) {
@Override
public void run() {
double x = Math.random() * 100;
double y = Math.random() * 100;
System.out.println(Thread.currentThread().getName() + "设置的距离x是" + x + ",y:" + y);
p.move(x, y);
try {
Thread.sleep(sleepTime[((finalI + 1) % 2)]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
var threadGet=new Thread("get"+i){
@Override
public void run() {
try {
Thread.sleep(sleepTime[(finalI%2)]);
} catch (InterruptedException e) {
e.printStackTrace();
}
double[] distance= p.getDistance();
System.out.println(Thread.currentThread().getName()+"最终获取到的距离x是"+distance[0]+",y:"+distance[1]);
}
};
if(finalI <50) {
threadMove.start();
}
threadGet.start();
}
}
}
class Point{
private double x,y;
private StampedLock stampedLock=new StampedLock();
public void move(double x,double y){
long writeLock=stampedLock.writeLock();//这应该是每个线程进来的writelock都不一样
System.out.println(Thread.currentThread().getName()+"写锁:"+writeLock);
try {
this.x = x;
this.y = y;
}finally {
stampedLock.unlock(writeLock);
}
}
public double[] getDistance(){
long readLock1=stampedLock.tryOptimisticRead();//获取乐观读锁;
System.out.println(Thread.currentThread().getName()+"获取乐观读锁:"+readLock1);
double[] result={this.x,this.y};
System.out.println(Thread.currentThread().getName()+"判断之前的返回的距离x是"+result[0]+",y:"+result[1]);
if (!stampedLock.validate(readLock1)) {
System.out.println(Thread.currentThread().getName()+"之前有其他线程改过数值,所以要重新赋值");
long readLock2 = stampedLock.readLock();//锁;
result = new double[]{this.x, this.y};
stampedLock.unlock(readLock2);
System.out.println(Thread.currentThread().getName()+"重新获取到的距离x是"+result[0]+",y:"+result[1]);
}
System.out.println(Thread.currentThread().getName()+"最终返回的距离x是"+result[0]+",y:"+result[1]);
return result;
}
}
截取执行过程当中读锁有被改过的数据:
一、
line18:get70获取乐观读锁:0
line19:get70判断之前的返回的距离x是0.0,y:0.0
line20:get74获取乐观读锁:0
line21:get74判断之前的返回的距离x是0.0,y:0.0
line22:get78获取乐观读锁:0
line23:get78判断之前的返回的距离x是0.0,y:0.0
line24:get74之前有其他线程改过数值,所以要重新赋值
line154:get70之前有其他线程改过数值,所以要重新赋值
line155:get78之前有其他线程改过数值,所以要重新赋值
line208:get74重新获取到的距离x是77.17042774882505,y:13.772237157330702
line212:get74最终返回的距离x是77.17042774882505,y:13.772237157330702
line214 :get74最终获取到的距离x是77.17042774882505,y:13.772237157330702
line332:get70重新获取到的距离x是22.23706036457895,y:64.3504309289694
line334:get78重新获取到的距离x是22.23706036457895,y:64.3504309289694
line336:get70最终返回的距离x是22.23706036457895,y:64.3504309289694
line357:get70最终获取到的距离x是22.23706036457895,y:64.3504309289694
line359:get78最终返回的距离x是22.23706036457895,y:64.3504309289694
line360:get78最终获取到的距离x是22.23706036457895,y:64.3504309289694
从这些执行过程可以看的出,读的时候,如果有发生写的过程数据就会重新获取
二、
line429-432
get41获取乐观读锁:13056
get41判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get41最终返回的距离x是22.23706036457895,y:64.3504309289694
get41最终获取到的距离x是22.23706036457895,y:64.3504309289694
从这些执行过程可以看的出,读的时候,未发生发生写的数据,就直接读取了。
执行过程:
move2设置的距离x是34.79183703414442,y:92.75276651457182
move16设置的距离x是13.767710412258637,y:73.51152235071706
move33设置的距离x是59.65008273979816,y:65.29016514713905
move32设置的距离x是74.66597890002177,y:26.285585320141223
move17设置的距离x是89.61060843929484,y:75.27031010638538
move40设置的距离x是66.05386803174777,y:84.7047164720158
move6设置的距离x是92.05086135366807,y:55.340397199266015
move4设置的距离x是12.257885882476295,y:23.987514419240174
move28设置的距离x是81.40921794986363,y:21.369465535248487
move18设置的距离x是58.2499798594047,y:21.593456841651783
move27设置的距离x是78.6198569585721,y:45.09455843445339
move39设置的距离x是39.66630486776626,y:31.021377981252474
move25设置的距离x是21.454510386827288,y:32.44685454996997
move43设置的距离x是83.00039475990332,y:55.88286541109865
move45设置的距离x是96.07817066583712,y:94.39653587636842
move34设置的距离x是77.61965567016351,y:83.47983766571143
move1设置的距离x是77.17042774882505,y:13.772237157330702
get70获取乐观读锁:0
get70判断之前的返回的距离x是0.0,y:0.0
get74获取乐观读锁:0
get74判断之前的返回的距离x是0.0,y:0.0
get78获取乐观读锁:0
get78判断之前的返回的距离x是0.0,y:0.0
get74之前有其他线程改过数值,所以要重新赋值
move21设置的距离x是92.685733225366,y:81.00881779295813
move9设置的距离x是28.43387699969292,y:44.63260076035994
get52获取乐观读锁:256
get52判断之前的返回的距离x是0.0,y:0.0
get52之前有其他线程改过数值,所以要重新赋值
move8设置的距离x是4.049994452268246,y:75.06424856495578
move42设置的距离x是6.005183487659882,y:79.45192643693221
move31设置的距离x是30.49646828271039,y:17.370268655801624
move19设置的距离x是16.56447995126942,y:17.941804779621005
move49设置的距离x是18.950563142297973,y:45.398476966801596
move3设置的距离x是19.856558394697664,y:38.434416171029575
move0设置的距离x是15.541907754680151,y:84.14733683997633
move20设置的距离x是54.41860720295764,y:51.2684632377027
move15设置的距离x是32.67411179688769,y:50.24752682896849
move7设置的距离x是68.0694585542797,y:7.322278250597137
move13设置的距离x是59.04481653985603,y:6.816739906060931
get80获取乐观读锁:0
get80判断之前的返回的距离x是0.0,y:0.0
get80之前有其他线程改过数值,所以要重新赋值
get76获取乐观读锁:0
get76判断之前的返回的距离x是0.0,y:0.0
get76之前有其他线程改过数值,所以要重新赋值
get56获取乐观读锁:0
get56判断之前的返回的距离x是0.0,y:0.0
get56之前有其他线程改过数值,所以要重新赋值
get84获取乐观读锁:0
get84判断之前的返回的距离x是0.0,y:0.0
get84之前有其他线程改过数值,所以要重新赋值
move10设置的距离x是55.90511446904437,y:49.57410935026248
get92获取乐观读锁:0
get92判断之前的返回的距离x是0.0,y:0.0
get34获取乐观读锁:0
get34判断之前的返回的距离x是0.0,y:0.0
get34之前有其他线程改过数值,所以要重新赋值
move5设置的距离x是4.745581243895258,y:84.19204110786866
get90获取乐观读锁:0
get90判断之前的返回的距离x是0.0,y:0.0
get90之前有其他线程改过数值,所以要重新赋值
get86获取乐观读锁:0
get86判断之前的返回的距离x是0.0,y:0.0
get86之前有其他线程改过数值,所以要重新赋值
get98获取乐观读锁:0
get98判断之前的返回的距离x是0.0,y:0.0
get98之前有其他线程改过数值,所以要重新赋值
get94获取乐观读锁:0
get94判断之前的返回的距离x是0.0,y:0.0
get94之前有其他线程改过数值,所以要重新赋值
get36获取乐观读锁:0
get36判断之前的返回的距离x是0.0,y:0.0
get36之前有其他线程改过数值,所以要重新赋值
get30获取乐观读锁:256
get30判断之前的返回的距离x是0.0,y:0.0
get30之前有其他线程改过数值,所以要重新赋值
move2写锁:384
get28获取乐观读锁:256
get28判断之前的返回的距离x是34.79183703414442,y:92.75276651457182
get28之前有其他线程改过数值,所以要重新赋值
get40获取乐观读锁:256
get40判断之前的返回的距离x是34.79183703414442,y:92.75276651457182
get40之前有其他线程改过数值,所以要重新赋值
get54获取乐观读锁:256
get54判断之前的返回的距离x是34.79183703414442,y:92.75276651457182
get54之前有其他线程改过数值,所以要重新赋值
get26获取乐观读锁:256
get26判断之前的返回的距离x是34.79183703414442,y:92.75276651457182
get26之前有其他线程改过数值,所以要重新赋值
move12设置的距离x是78.94455194073402,y:30.614319212516982
move12写锁:640
move30设置的距离x是64.60818718364189,y:18.284257985893415
move30写锁:896
get20获取乐观读锁:1024
get20判断之前的返回的距离x是64.60818718364189,y:18.284257985893415
move33写锁:1152
move32写锁:1408
get18获取乐观读锁:1536
get18判断之前的返回的距离x是74.66597890002177,y:26.285585320141223
get20最终返回的距离x是64.60818718364189,y:18.284257985893415
get18最终返回的距离x是74.66597890002177,y:26.285585320141223
get20最终获取到的距离x是64.60818718364189,y:18.284257985893415
move35设置的距离x是31.789968952290682,y:65.24506066545298
move35写锁:1664
get66获取乐观读锁:1792
get66判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get66之前有其他线程改过数值,所以要重新赋值
move47设置的距离x是29.546306441807424,y:91.91138108815665
get18最终获取到的距离x是74.66597890002177,y:26.285585320141223
get82获取乐观读锁:0
get82判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get82之前有其他线程改过数值,所以要重新赋值
get32获取乐观读锁:256
get8获取乐观读锁:256
get48获取乐观读锁:256
get8判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get10获取乐观读锁:256
get50获取乐观读锁:256
get38获取乐观读锁:256
move22设置的距离x是47.35438483689395,y:40.59316085505408
move11设置的距离x是76.69585448999914,y:97.5056915462146
move44设置的距离x是97.73031736090174,y:48.488606997258465
move38设置的距离x是48.94066120652973,y:84.87205625916434
move48设置的距离x是96.095791717126,y:64.02679357709314
move46设置的距离x是23.16225093353187,y:21.59925100522613
move24设置的距离x是44.38980811270115,y:52.549366736149686
move23设置的距离x是95.66126035299493,y:49.64036118790298
move29设置的距离x是89.74414355791743,y:40.16566368453817
move14设置的距离x是80.25019838804401,y:57.354466483020694
get38判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get38之前有其他线程改过数值,所以要重新赋值
get50判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get50之前有其他线程改过数值,所以要重新赋值
get10判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get10之前有其他线程改过数值,所以要重新赋值
get8之前有其他线程改过数值,所以要重新赋值
get48判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get48之前有其他线程改过数值,所以要重新赋值
get32判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get32之前有其他线程改过数值,所以要重新赋值
get16获取乐观读锁:0
move17写锁:1920
get14获取乐观读锁:1536
move40写锁:2176
get92之前有其他线程改过数值,所以要重新赋值
get2获取乐观读锁:256
get62获取乐观读锁:256
get12获取乐观读锁:256
move37设置的距离x是66.27658376460506,y:48.46300586660085
get0获取乐观读锁:256
get0判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get0之前有其他线程改过数值,所以要重新赋值
get70之前有其他线程改过数值,所以要重新赋值
get78之前有其他线程改过数值,所以要重新赋值
get6获取乐观读锁:256
get6判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get6之前有其他线程改过数值,所以要重新赋值
move41设置的距离x是66.02825493397508,y:47.675905461747035
move26设置的距离x是17.73671876469286,y:39.31110466424109
get24获取乐观读锁:0
get24判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get24之前有其他线程改过数值,所以要重新赋值
get4获取乐观读锁:256
get4判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get4之前有其他线程改过数值,所以要重新赋值
move36设置的距离x是22.23706036457895,y:64.3504309289694
get58获取乐观读锁:256
get58判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get58之前有其他线程改过数值,所以要重新赋值
get60获取乐观读锁:0
get60判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get60之前有其他线程改过数值,所以要重新赋值
get72获取乐观读锁:0
get72判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get72之前有其他线程改过数值,所以要重新赋值
get68获取乐观读锁:0
get12判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get12之前有其他线程改过数值,所以要重新赋值
get62判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get62之前有其他线程改过数值,所以要重新赋值
get2判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get2之前有其他线程改过数值,所以要重新赋值
move6写锁:2432
get14判断之前的返回的距离x是89.61060843929484,y:75.27031010638538
get14之前有其他线程改过数值,所以要重新赋值
move4写锁:2688
get16判断之前的返回的距离x是31.789968952290682,y:65.24506066545298
get16之前有其他线程改过数值,所以要重新赋值
move28写锁:2944
move18写锁:3200
get68判断之前的返回的距离x是66.05386803174777,y:84.7047164720158
get68之前有其他线程改过数值,所以要重新赋值
move27写锁:3456
move16写锁:3712
move39写锁:3968
move25写锁:4224
move43写锁:4480
move45写锁:4736
move34写锁:4992
move1写锁:5248
move21写锁:5504
move9写锁:5760
move8写锁:6016
move42写锁:6272
move31写锁:6528
get52重新获取到的距离x是28.43387699969292,y:44.63260076035994
get74重新获取到的距离x是77.17042774882505,y:13.772237157330702
get52最终返回的距离x是28.43387699969292,y:44.63260076035994
move19写锁:6784
get52最终获取到的距离x是28.43387699969292,y:44.63260076035994
get74最终返回的距离x是77.17042774882505,y:13.772237157330702
move49写锁:7040
get74最终获取到的距离x是77.17042774882505,y:13.772237157330702
move3写锁:7296
move0写锁:7552
move20写锁:7808
move15写锁:8064
move7写锁:8320
move13写锁:8576
get84重新获取到的距离x是59.04481653985603,y:6.816739906060931
get84最终返回的距离x是59.04481653985603,y:6.816739906060931
get84最终获取到的距离x是59.04481653985603,y:6.816739906060931
get80重新获取到的距离x是59.04481653985603,y:6.816739906060931
get80最终返回的距离x是59.04481653985603,y:6.816739906060931
move10写锁:8832
get76重新获取到的距离x是59.04481653985603,y:6.816739906060931
get76最终返回的距离x是59.04481653985603,y:6.816739906060931
move5写锁:9088
get34重新获取到的距离x是55.90511446904437,y:49.57410935026248
get34最终返回的距离x是55.90511446904437,y:49.57410935026248
get54重新获取到的距离x是4.745581243895258,y:84.19204110786866
get54最终返回的距离x是4.745581243895258,y:84.19204110786866
get36重新获取到的距离x是4.745581243895258,y:84.19204110786866
get98重新获取到的距离x是4.745581243895258,y:84.19204110786866
get94重新获取到的距离x是4.745581243895258,y:84.19204110786866
get86重新获取到的距离x是4.745581243895258,y:84.19204110786866
get80最终获取到的距离x是59.04481653985603,y:6.816739906060931
get56重新获取到的距离x是59.04481653985603,y:6.816739906060931
get86最终返回的距离x是4.745581243895258,y:84.19204110786866
get86最终获取到的距离x是4.745581243895258,y:84.19204110786866
get94最终返回的距离x是4.745581243895258,y:84.19204110786866
get98最终返回的距离x是4.745581243895258,y:84.19204110786866
get36最终返回的距离x是4.745581243895258,y:84.19204110786866
get54最终获取到的距离x是4.745581243895258,y:84.19204110786866
get30重新获取到的距离x是4.745581243895258,y:84.19204110786866
get30最终返回的距离x是4.745581243895258,y:84.19204110786866
get28重新获取到的距离x是4.745581243895258,y:84.19204110786866
get34最终获取到的距离x是55.90511446904437,y:49.57410935026248
get40重新获取到的距离x是4.745581243895258,y:84.19204110786866
get26重新获取到的距离x是4.745581243895258,y:84.19204110786866
get26最终返回的距离x是4.745581243895258,y:84.19204110786866
get90重新获取到的距离x是4.745581243895258,y:84.19204110786866
get66重新获取到的距离x是4.745581243895258,y:84.19204110786866
get76最终获取到的距离x是59.04481653985603,y:6.816739906060931
get66最终返回的距离x是4.745581243895258,y:84.19204110786866
get90最终返回的距离x是4.745581243895258,y:84.19204110786866
get26最终获取到的距离x是4.745581243895258,y:84.19204110786866
get40最终返回的距离x是4.745581243895258,y:84.19204110786866
get40最终获取到的距离x是4.745581243895258,y:84.19204110786866
get28最终返回的距离x是4.745581243895258,y:84.19204110786866
get30最终获取到的距离x是4.745581243895258,y:84.19204110786866
get36最终获取到的距离x是4.745581243895258,y:84.19204110786866
get98最终获取到的距离x是4.745581243895258,y:84.19204110786866
get94最终获取到的距离x是4.745581243895258,y:84.19204110786866
move47写锁:9344
get56最终返回的距离x是59.04481653985603,y:6.816739906060931
move22写锁:9600
get82重新获取到的距离x是29.546306441807424,y:91.91138108815665
get28最终获取到的距离x是4.745581243895258,y:84.19204110786866
get90最终获取到的距离x是4.745581243895258,y:84.19204110786866
get66最终获取到的距离x是4.745581243895258,y:84.19204110786866
get96获取乐观读锁:0
get82最终返回的距离x是29.546306441807424,y:91.91138108815665
get82最终获取到的距离x是29.546306441807424,y:91.91138108815665
move11写锁:9856
get56最终获取到的距离x是59.04481653985603,y:6.816739906060931
move44写锁:10112
move38写锁:10368
move48写锁:10624
move46写锁:10880
get96判断之前的返回的距离x是47.35438483689395,y:40.59316085505408
get96之前有其他线程改过数值,所以要重新赋值
move24写锁:11136
move23写锁:11392
move14写锁:11648
move29写锁:11904
move37写锁:12160
get38重新获取到的距离x是89.74414355791743,y:40.16566368453817
get38最终返回的距离x是89.74414355791743,y:40.16566368453817
get38最终获取到的距离x是89.74414355791743,y:40.16566368453817
get48重新获取到的距离x是66.27658376460506,y:48.46300586660085
get48最终返回的距离x是66.27658376460506,y:48.46300586660085
get48最终获取到的距离x是66.27658376460506,y:48.46300586660085
get10重新获取到的距离x是66.27658376460506,y:48.46300586660085
get92重新获取到的距离x是89.74414355791743,y:40.16566368453817
get50重新获取到的距离x是66.27658376460506,y:48.46300586660085
get50最终返回的距离x是66.27658376460506,y:48.46300586660085
get8重新获取到的距离x是66.27658376460506,y:48.46300586660085
get50最终获取到的距离x是66.27658376460506,y:48.46300586660085
get10最终返回的距离x是66.27658376460506,y:48.46300586660085
get32重新获取到的距离x是66.27658376460506,y:48.46300586660085
get10最终获取到的距离x是66.27658376460506,y:48.46300586660085
get0重新获取到的距离x是66.27658376460506,y:48.46300586660085
get0最终返回的距离x是66.27658376460506,y:48.46300586660085
get0最终获取到的距离x是66.27658376460506,y:48.46300586660085
get8最终返回的距离x是66.27658376460506,y:48.46300586660085
get92最终返回的距离x是89.74414355791743,y:40.16566368453817
get8最终获取到的距离x是66.27658376460506,y:48.46300586660085
get32最终返回的距离x是66.27658376460506,y:48.46300586660085
get32最终获取到的距离x是66.27658376460506,y:48.46300586660085
move41写锁:12416
get92最终获取到的距离x是89.74414355791743,y:40.16566368453817
move26写锁:12672
get24重新获取到的距离x是17.73671876469286,y:39.31110466424109
move36写锁:12928
get4重新获取到的距离x是17.73671876469286,y:39.31110466424109
get16重新获取到的距离x是22.23706036457895,y:64.3504309289694
get62重新获取到的距离x是22.23706036457895,y:64.3504309289694
get24最终返回的距离x是17.73671876469286,y:39.31110466424109
get62最终返回的距离x是22.23706036457895,y:64.3504309289694
get60重新获取到的距离x是22.23706036457895,y:64.3504309289694
get16最终返回的距离x是22.23706036457895,y:64.3504309289694
get12重新获取到的距离x是22.23706036457895,y:64.3504309289694
get2重新获取到的距离x是22.23706036457895,y:64.3504309289694
get4最终返回的距离x是17.73671876469286,y:39.31110466424109
get72重新获取到的距离x是22.23706036457895,y:64.3504309289694
get14重新获取到的距离x是22.23706036457895,y:64.3504309289694
get68重新获取到的距离x是22.23706036457895,y:64.3504309289694
get6重新获取到的距离x是22.23706036457895,y:64.3504309289694
get58重新获取到的距离x是22.23706036457895,y:64.3504309289694
get70重新获取到的距离x是22.23706036457895,y:64.3504309289694
get96重新获取到的距离x是22.23706036457895,y:64.3504309289694
get78重新获取到的距离x是22.23706036457895,y:64.3504309289694
get96最终返回的距离x是22.23706036457895,y:64.3504309289694
get70最终返回的距离x是22.23706036457895,y:64.3504309289694
get58最终返回的距离x是22.23706036457895,y:64.3504309289694
get6最终返回的距离x是22.23706036457895,y:64.3504309289694
get68最终返回的距离x是22.23706036457895,y:64.3504309289694
get14最终返回的距离x是22.23706036457895,y:64.3504309289694
get72最终返回的距离x是22.23706036457895,y:64.3504309289694
get4最终获取到的距离x是17.73671876469286,y:39.31110466424109
get2最终返回的距离x是22.23706036457895,y:64.3504309289694
get2最终获取到的距离x是22.23706036457895,y:64.3504309289694
get12最终返回的距离x是22.23706036457895,y:64.3504309289694
get16最终获取到的距离x是22.23706036457895,y:64.3504309289694
get60最终返回的距离x是22.23706036457895,y:64.3504309289694
get62最终获取到的距离x是22.23706036457895,y:64.3504309289694
get24最终获取到的距离x是17.73671876469286,y:39.31110466424109
get60最终获取到的距离x是22.23706036457895,y:64.3504309289694
get12最终获取到的距离x是22.23706036457895,y:64.3504309289694
get72最终获取到的距离x是22.23706036457895,y:64.3504309289694
get14最终获取到的距离x是22.23706036457895,y:64.3504309289694
get68最终获取到的距离x是22.23706036457895,y:64.3504309289694
get6最终获取到的距离x是22.23706036457895,y:64.3504309289694
get58最终获取到的距离x是22.23706036457895,y:64.3504309289694
get70最终获取到的距离x是22.23706036457895,y:64.3504309289694
get96最终获取到的距离x是22.23706036457895,y:64.3504309289694
get78最终返回的距离x是22.23706036457895,y:64.3504309289694
get78最终获取到的距离x是22.23706036457895,y:64.3504309289694
get88获取乐观读锁:13056
get88判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get88最终返回的距离x是22.23706036457895,y:64.3504309289694
get88最终获取到的距离x是22.23706036457895,y:64.3504309289694
get64获取乐观读锁:13056
get64判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get64最终返回的距离x是22.23706036457895,y:64.3504309289694
get64最终获取到的距离x是22.23706036457895,y:64.3504309289694
get5获取乐观读锁:13056
get3获取乐观读锁:13056
get1获取乐观读锁:13056
get3判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get5判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get3最终返回的距离x是22.23706036457895,y:64.3504309289694
get1判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get3最终获取到的距离x是22.23706036457895,y:64.3504309289694
get5最终返回的距离x是22.23706036457895,y:64.3504309289694
get5最终获取到的距离x是22.23706036457895,y:64.3504309289694
get1最终返回的距离x是22.23706036457895,y:64.3504309289694
get1最终获取到的距离x是22.23706036457895,y:64.3504309289694
get7获取乐观读锁:13056
get7判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get7最终返回的距离x是22.23706036457895,y:64.3504309289694
get7最终获取到的距离x是22.23706036457895,y:64.3504309289694
get9获取乐观读锁:13056
get9判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get9最终返回的距离x是22.23706036457895,y:64.3504309289694
get9最终获取到的距离x是22.23706036457895,y:64.3504309289694
get11获取乐观读锁:13056
get11判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get11最终返回的距离x是22.23706036457895,y:64.3504309289694
get11最终获取到的距离x是22.23706036457895,y:64.3504309289694
get22获取乐观读锁:13056
get22判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get22最终返回的距离x是22.23706036457895,y:64.3504309289694
get22最终获取到的距离x是22.23706036457895,y:64.3504309289694
get42获取乐观读锁:13056
get42判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get42最终返回的距离x是22.23706036457895,y:64.3504309289694
get44获取乐观读锁:13056
get46获取乐观读锁:13056
get44判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get42最终获取到的距离x是22.23706036457895,y:64.3504309289694
get44最终返回的距离x是22.23706036457895,y:64.3504309289694
get44最终获取到的距离x是22.23706036457895,y:64.3504309289694
get46判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get46最终返回的距离x是22.23706036457895,y:64.3504309289694
get46最终获取到的距离x是22.23706036457895,y:64.3504309289694
get43获取乐观读锁:13056
get43判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get43最终返回的距离x是22.23706036457895,y:64.3504309289694
get43最终获取到的距离x是22.23706036457895,y:64.3504309289694
get47获取乐观读锁:13056
get49获取乐观读锁:13056
get49判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get49最终返回的距离x是22.23706036457895,y:64.3504309289694
get49最终获取到的距离x是22.23706036457895,y:64.3504309289694
get47判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get37获取乐观读锁:13056
get37判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get37最终返回的距离x是22.23706036457895,y:64.3504309289694
get37最终获取到的距离x是22.23706036457895,y:64.3504309289694
get45获取乐观读锁:13056
get45判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get45最终返回的距离x是22.23706036457895,y:64.3504309289694
get45最终获取到的距离x是22.23706036457895,y:64.3504309289694
get47最终返回的距离x是22.23706036457895,y:64.3504309289694
get47最终获取到的距离x是22.23706036457895,y:64.3504309289694
get41获取乐观读锁:13056
get41判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get41最终返回的距离x是22.23706036457895,y:64.3504309289694
get41最终获取到的距离x是22.23706036457895,y:64.3504309289694
get39获取乐观读锁:13056
get39判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get39最终返回的距离x是22.23706036457895,y:64.3504309289694
get39最终获取到的距离x是22.23706036457895,y:64.3504309289694
get35获取乐观读锁:13056
get35判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get51获取乐观读锁:13056
get51判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get51最终返回的距离x是22.23706036457895,y:64.3504309289694
get51最终获取到的距离x是22.23706036457895,y:64.3504309289694
get55获取乐观读锁:13056
get55判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get55最终返回的距离x是22.23706036457895,y:64.3504309289694
get55最终获取到的距离x是22.23706036457895,y:64.3504309289694
get35最终返回的距离x是22.23706036457895,y:64.3504309289694
get35最终获取到的距离x是22.23706036457895,y:64.3504309289694
get59获取乐观读锁:13056
get59判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get59最终返回的距离x是22.23706036457895,y:64.3504309289694
get59最终获取到的距离x是22.23706036457895,y:64.3504309289694
get29获取乐观读锁:13056
get29判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get63获取乐观读锁:13056
get63判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get63最终返回的距离x是22.23706036457895,y:64.3504309289694
get63最终获取到的距离x是22.23706036457895,y:64.3504309289694
get29最终返回的距离x是22.23706036457895,y:64.3504309289694
get29最终获取到的距离x是22.23706036457895,y:64.3504309289694
get25获取乐观读锁:13056
get25判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get25最终返回的距离x是22.23706036457895,y:64.3504309289694
get25最终获取到的距离x是22.23706036457895,y:64.3504309289694
get31获取乐观读锁:13056
get31判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get31最终返回的距离x是22.23706036457895,y:64.3504309289694
get31最终获取到的距离x是22.23706036457895,y:64.3504309289694
get27获取乐观读锁:13056
get27判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get27最终返回的距离x是22.23706036457895,y:64.3504309289694
get27最终获取到的距离x是22.23706036457895,y:64.3504309289694
get53获取乐观读锁:13056
get53判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get53最终返回的距离x是22.23706036457895,y:64.3504309289694
get15获取乐观读锁:13056
get15判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get53最终获取到的距离x是22.23706036457895,y:64.3504309289694
get15最终返回的距离x是22.23706036457895,y:64.3504309289694
get15最终获取到的距离x是22.23706036457895,y:64.3504309289694
get19获取乐观读锁:13056
get19判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get19最终返回的距离x是22.23706036457895,y:64.3504309289694
get19最终获取到的距离x是22.23706036457895,y:64.3504309289694
get21获取乐观读锁:13056
get21判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get21最终返回的距离x是22.23706036457895,y:64.3504309289694
get21最终获取到的距离x是22.23706036457895,y:64.3504309289694
get23获取乐观读锁:13056
get23判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get23最终返回的距离x是22.23706036457895,y:64.3504309289694
get23最终获取到的距离x是22.23706036457895,y:64.3504309289694
get33获取乐观读锁:13056
get33判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get33最终返回的距离x是22.23706036457895,y:64.3504309289694
get33最终获取到的距离x是22.23706036457895,y:64.3504309289694
get81获取乐观读锁:13056
get81判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get81最终返回的距离x是22.23706036457895,y:64.3504309289694
get81最终获取到的距离x是22.23706036457895,y:64.3504309289694
get77获取乐观读锁:13056
get79获取乐观读锁:13056
get79判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get79最终返回的距离x是22.23706036457895,y:64.3504309289694
get79最终获取到的距离x是22.23706036457895,y:64.3504309289694
get77判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get77最终返回的距离x是22.23706036457895,y:64.3504309289694
get77最终获取到的距离x是22.23706036457895,y:64.3504309289694
get73获取乐观读锁:13056
get67获取乐观读锁:13056
get71获取乐观读锁:13056
get71判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get83获取乐观读锁:13056
get83判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get83最终返回的距离x是22.23706036457895,y:64.3504309289694
get83最终获取到的距离x是22.23706036457895,y:64.3504309289694
get69获取乐观读锁:13056
get69判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get69最终返回的距离x是22.23706036457895,y:64.3504309289694
get69最终获取到的距离x是22.23706036457895,y:64.3504309289694
get71最终返回的距离x是22.23706036457895,y:64.3504309289694
get71最终获取到的距离x是22.23706036457895,y:64.3504309289694
get75获取乐观读锁:13056
get75判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get75最终返回的距离x是22.23706036457895,y:64.3504309289694
get75最终获取到的距离x是22.23706036457895,y:64.3504309289694
get67判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get67最终返回的距离x是22.23706036457895,y:64.3504309289694
get67最终获取到的距离x是22.23706036457895,y:64.3504309289694
get73判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get73最终返回的距离x是22.23706036457895,y:64.3504309289694
get73最终获取到的距离x是22.23706036457895,y:64.3504309289694
get61获取乐观读锁:13056
get61判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get61最终返回的距离x是22.23706036457895,y:64.3504309289694
get61最终获取到的距离x是22.23706036457895,y:64.3504309289694
get95获取乐观读锁:13056
get95判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get95最终返回的距离x是22.23706036457895,y:64.3504309289694
get95最终获取到的距离x是22.23706036457895,y:64.3504309289694
get87获取乐观读锁:13056
get87判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get87最终返回的距离x是22.23706036457895,y:64.3504309289694
get87最终获取到的距离x是22.23706036457895,y:64.3504309289694
get99获取乐观读锁:13056
get99判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get99最终返回的距离x是22.23706036457895,y:64.3504309289694
get91获取乐观读锁:13056
get91判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get91最终返回的距离x是22.23706036457895,y:64.3504309289694
get91最终获取到的距离x是22.23706036457895,y:64.3504309289694
get99最终获取到的距离x是22.23706036457895,y:64.3504309289694
get97获取乐观读锁:13056
get97判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get97最终返回的距离x是22.23706036457895,y:64.3504309289694
get97最终获取到的距离x是22.23706036457895,y:64.3504309289694
get65获取乐观读锁:13056
get65判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get65最终返回的距离x是22.23706036457895,y:64.3504309289694
get65最终获取到的距离x是22.23706036457895,y:64.3504309289694
get89获取乐观读锁:13056
get89判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get89最终返回的距离x是22.23706036457895,y:64.3504309289694
get89最终获取到的距离x是22.23706036457895,y:64.3504309289694
get93获取乐观读锁:13056
get93判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get93最终返回的距离x是22.23706036457895,y:64.3504309289694
get93最终获取到的距离x是22.23706036457895,y:64.3504309289694
get85获取乐观读锁:13056
get85判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get85最终返回的距离x是22.23706036457895,y:64.3504309289694
get85最终获取到的距离x是22.23706036457895,y:64.3504309289694
get17获取乐观读锁:13056
get13获取乐观读锁:13056
get13判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get13最终返回的距离x是22.23706036457895,y:64.3504309289694
get13最终获取到的距离x是22.23706036457895,y:64.3504309289694
get17判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get17最终返回的距离x是22.23706036457895,y:64.3504309289694
get17最终获取到的距离x是22.23706036457895,y:64.3504309289694
get57获取乐观读锁:13056
get57判断之前的返回的距离x是22.23706036457895,y:64.3504309289694
get57最终返回的距离x是22.23706036457895,y:64.3504309289694
get57最终获取到的距离x是22.23706036457895,y:64.3504309289694