StampedLock执行过程查看

资料来源:

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
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
StampedLockJava 8 引入的一种新的锁机制,它是 ReentrantReadWriteLock 的改进版本,提供了更高级别的并发控制。 StampedLock 主要有三种模式:读模式、写模式和乐观读模式。 1. 读模式(Read Mode):多个线程可以同时获取读锁,只要没有线程持有写锁。读锁是共享的,可以提供高并发性。 2. 写模式(Write Mode):写锁是独占的,当一个线程持有写锁时,其他线程无法获取读锁或写锁,保证了数据的一致性。 3. 乐观读模式(Optimistic Read Mode):乐观读是一种特殊的读模式,不需要获取锁。在乐观读之前,先获取一个标记(stamp),然后在验证数据是否被修改的过程中,数据是不受保护的。如果数据没有被修改,则认为读取成功,否则需要重新尝试。乐观读适用于读操作频繁、写操作较少的场景。 StampedLock 的使用示例如下: ```java import java.util.concurrent.locks.StampedLock; public class Example { private final StampedLock lock = new StampedLock(); private int x; private int y; public void writeData(int newX, int newY) { long stamp = lock.writeLock(); try { x = newX; y = newY; } finally { lock.unlockWrite(stamp); } } public double readDistanceFromOrigin() { long stamp = lock.tryOptimisticRead(); int currentX = x; int currentY = y; if (!lock.validate(stamp)) { stamp = lock.readLock(); try { currentX = x; currentY = y; } finally { lock.unlockRead(stamp); } } return Math.sqrt(currentX * currentX + currentY * currentY); } } ``` 在示例中,我们使用 StampedLock 来保护数据的读写操作。writeData() 方法通过 writeLock() 获取写锁,然后修改数据。readDistanceFromOrigin() 方法使用了乐观读模式,首先尝试获取一个标记(stamp),然后读取数据并计算距离。如果在验证数据的过程中发现数据已被修改,就需要重新获取读锁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值