• linqw
    2019-04-09
    课后思考题:在锁升级成功的时候,最后没有释放最新的写锁,可以在if块的break上加个stamp=ws进行释放

    作者回复: 👍

     1
     36
  • 胡桥
    2019-04-09
    乐观锁的想法是“没事,肯定没被改过”,于是就开心地获取到数据,不放心吗?那就再验证一下,看看真的没被改过吧?这下可以放心使用数据了。
    我的问题是,验证完之后、使用数据之前,数据被其他线程改了怎么办?我看不出validate的意义。这个和数据库更新好像还不一样,数据库是在写的时候发现已经被其他人写了。这里validate之后也难免数据在进行业务计算之前已经被改掉了啊?

    作者回复: 改了就改了,读的数据是正确的一致的就可以了。如果这个规则不满足业务需求,可以总互斥锁。不同的锁用不同地方。

     2
     16
  • Presley
    2019-04-09
    老师,StampedLock 读模板,先通过乐观读或者悲观读锁获取变量,然后利用这些变量处理业务逻辑,会不会存在线程安全的情况呢? 比如,读出来的变量没问题,但是进行业务逻辑处理的时候,这时,读出的变量有可能发生变化了吧(比如被写锁改写了)?所以,当使用乐观读锁时,是不是等业务都处理完了(比如先利用变量把距离计算完),再判断变量是否被改写,如果没改写,直接return;如果已经改写,则使用悲观读锁做同样的事情。不过如果业务比较耗时,可能持有悲观锁的时间会比较长,不知道理解对不对

    作者回复: 两种场景,如果处理业务需要保持互斥,那么就用互斥锁,如果不需要保持互斥才可以用读写锁。一般来讲缓存是不需要保持互斥性的,能接受瞬间的不一致

    
     12
  • Grubby🐑
    2019-04-09
    bug是tryConvertToWriteLock返回的write stamp没有重新赋值给stamp

    作者回复: 👍

     1
     9
  • Grubby🐑
    2019-04-09
    老师,调用interrupt引起cpu飙高的原因是什么

    作者回复: 内部实现里while循环里面对中断的处理有点问题

    
     7
  • 发条橙子 。
    2019-04-15
    老师 , 我看事例里面成员变量都给了一个 final 关键字 。 请问这里给变量加 final的用意是什么 ,仅仅是为了防止下面方法中代码给他赋新的对象么 。 我在平常写代码中很少有给变量加 final 的习惯, 希望老师能指点一下 😄

    作者回复: 使用final是个好习惯

     1
     5
  • echo_陈
    2019-04-09
    以前看过java并发编程实战,讲jdk并发类库……不过那个书籍是jdk1.7版本……所以是头一次接触StempLock……涨知识了
    
     5
  • ttang
    2019-04-10
    老师,ReadWriteLock锁和StampedLock锁都是可以同时读的,区别是StampedLock乐观读不加锁。那StampedLock比ReadWriteLock性能高的原因就是节省了加读锁的性能损耗吗?另外StampedLock用乐观读的时候是允许一个线程获取写锁的,是不是可以理解为StampedLock对写的性能更高,会不会因为写锁获取概率增大大,导致不能获取读锁。导致StampedLock读性能反而没有ReadWriteLock高?

    作者回复: 乐观读升级到悲观读,就和ReadWriteLock一样了。

    
     3
  • 冯传博
    2019-04-09
    解释一下 cpu 飙升的原因呗
    
     3
  • 密码123456
    2019-04-09
    悲观锁和乐观锁。悲观锁,就是普通的锁。乐观锁,就是无锁,仅增加一个版本号,在取完数据验证一下版本号。如果不一致那么就进行悲观锁获取锁。能够这么理解吗?
    
     3
  • 南北少卿
    2019-05-12
    jdk源码StampedLock中的示例,if (ws != 0L) 时使用了stamp=ws

    作者回复: 👍

    
     2
  • 疯狂咸鱼
    2019-07-17
    老师, if (ws != 0L)这个是判断是什么的?
    
     1
  • linqw
    2019-06-15
    从头重新看一篇,也自己大致写了下对StampedLock的源码分析https://juejin.im/editor/posts/5d00a6c8e51d45105d63a4ed,老师有空帮忙看下哦

    作者回复: 👍,有空我也学习一下😄

    
     1
  • 狂风骤雨
    2019-05-06
    老师,你上章讲的ReadWriteLock,说的是当有一个线程在执行写操作时所有的读线程都被阻塞,本章你又提了一下ReadWriteLock,说的是当有多个线程进行读操作时,所有的写操作都被阻塞,这样是

    作者回复: 读写是互斥的

    
     1
  • ban
    2019-04-13
    老师,你好,
    如果我在前面long stamp = sl.readLock();升级锁后long ws = sl.tryConvertToWriteLock(stamp);
    这个 stamp和ws是什么关系来的,是sl.unlockRead(是关stamp还是ws)。两者有什么区别呢

    作者回复: stamp和ws没关系,tryConvertToWriteLock(stamp)这个方法内部会释放悲观读锁stamp(条件是能够升级成功)。所以我们需要释放的是ws

    
     1
  • on the way
    2019-04-11
    有点没看明白示例interrupt那个代码里的 Thread.sleep(100)…

    作者回复: 就是等一会儿,保证前面的子线程已经启动包

    
     1
  • yalio
    2020-01-31
    例子中获取x,y共享变量的值时,怎么保证是读取的最新的值呢,如果是当前线程的缓存值怎么办
    
    
  • Guess
    2019-12-31
    老师(或大牛)能不能帮忙解惑
    问题来源是StampedLock和ReadWriteLock的区别
    1. StampedLock为什么不支持线程重入?(能不能解释一下)
    2. StampedLock的悲观锁、写锁都不支持条件变量,这个条件变量在ReadWriteLock指的是什么?(是Condition吗?)
    3. 如果线程阻塞在StampedLock的readLock || writeLock此时调用该线程的interrupt()方法会导致CPU飙升。是什么原因导致的?
    
    
  • james
    2019-12-23
    老师 validate 成功后 执行Math 时候x和y还是会被其他线程改了啊 ,和不validate 没啥区别啊
    
    
  • 走马
    2019-12-20
    您好,老师,我一直有个疑惑, 类似ERP的系统,它的程序代码本身没做并发处理,但是卖的时候会和客户说不同并发价格不一样,它是怎么做到的 ? 是由一个独立的软件来处理并发吗?

    作者回复: 这个我回答不了😂

    
    
我们在线,来聊聊吧