• 密码123456
    2019-04-06
    有多少跟我一样,发的内容能够看的懂。一到思考题,要么不会,要么心里的答案答非所问。
     5
     122
  • linqw
    2019-04-07
    1、课后习题感觉可以使用第一种方法:①ps -ef | grep java查看pid②top -p查看java中的线程③使用jstack将其堆栈信息保存下来,查看是否是锁升级导致的阻塞问题。第二种方法:感觉可以调用下有获取只有读锁的接口,看下是否会阻塞,如果没有阻塞可以在调用下写锁的接口,如果阻塞表明有读锁。
    2、读写锁也是使用volatile的state变量+加上happens-before来保证可见性么?
    3、写下缓存和数据库的一致性问题的理解,如果先写缓存再写数据库,使用分布式锁,如果先写数据库再写缓存,①比如文中所说的使用binlog,canal+mq,但是感觉这个还得看具体情况,有可能binlog使用了组提交,不是马上写的binlog文件中,感觉也是会有延迟②感觉也可以使用定时任务定时的扫描任务表③使用消息队列
    
     28
  • 缪文@场景鹿
    2019-04-07
    老师,感觉这里的读写锁,性能还有可以提升的地方,因为这里可能很多业务都会使用这个缓存懒加载,实际生产环境,写缓存操作可能会比较多,那么不同的缓存key,实际上是没有并发冲突的,所以这里的读写锁可以按key前缀拆分,即使是同一个key,也可以类似ConcurrentHash 一样分段来减少并发冲突

    作者回复: 可以这样

    
     22
  • Kǎfκã²⁰²⁰
    2019-04-06
    考虑到是线上应用,可采用以下方法
    1. 源代码分析。查找ReentrantReadWriteLock在项目中的引用,看下写锁是否在读锁释放前尝试获取
    2. 如果线上是Web应用,应用服务器比如说是Tomcat,并且开启了JMX,则可以通过JConsole等工具远程查看下线上死锁的具体情况

    作者回复: 👍

     1
     21
  • crazypokerk
    2019-04-06
    老师,可不可以这样理解,ReadWirteLock不支持锁的升级,指的是:在不释放读锁的前提下,无法继续获取写锁,但是如果在释放了读锁之后,是可以升级为写锁的。锁的降级就是:在不释放写锁的前提下,获取读锁是可以的。请老师指正,感谢。

    作者回复: 可以这样理解,不过释放了读锁,也就谈不上升级了

    
     17
  • ycfHH
    2019-05-07
    问题1:获取写锁的前提是读锁和写锁均未被占用?
    问题2:获取读锁的前提是没有其他线程占用写锁?
    基于以上两点所以只支持锁降级而不允许锁升级。
    问题3
    高并发下,申请写锁时是不是中断其他线程申请读锁,然后等待已有读锁全部释放再获取写锁?因为如果没有禁止读锁的申请的话在读多写少的情况下写锁可能一直获取不到。
    这块不太懂,希望老师能指点一下。
    展开

    作者回复: 获取写锁的前提是读锁和写锁均未被占用
    获取读锁的前提是没有其他线程占用写锁
    申请写锁时不中断其他线程申请读锁
    公平锁如果过有写申请,能禁止读锁

     1
     16
  • xuery
    2019-05-01
    读锁不能升级为写锁:好理解,本线程在释放读锁之前,想要获取写锁是不一定能获取到的,因为其他线程可能持有读锁(读锁共享),可能导致阻塞较长的时间,所以java干脆直接不支持读锁升级为写锁。
    写锁可以降级为读锁:也好理解,本线程在释放写锁之前,获取读锁一定是可以立刻获取到的,不存在其他线程持有读锁或者写锁(读写锁互斥),所以java允许锁降级
     2
     12
  • WL
    2019-04-09
    老师我们现在的项目全都是集群部署, 感觉在这种情况下是不是单机的Lock,和Synchronized都用不上, 只能采用分布式锁的方案? 那么这种情况下, 如何提高每个实例的并发效率?

    作者回复: 分布式有分布式的锁,单机的效率就是靠多线程了

    
     8
  • Dylan
    2019-04-06
    一般都说线程池有界队列使用ArrayBlockingQueue,无界队列使用LinkedBlockingQueue,我很奇怪,有界无界不是取决于创建的时候传不传capacity参数么,我现在想创建线程池的时候,new LinkedBlockingQueue(2000)这样定义有界队列,请问可以吗?

    作者回复: 可以,ArrayBlockingQueue有界是因为必须传capacity参数,LinkedBlockingQueue传capacity参数就是有界,不传就是无界

    
     5
  • 随风而逝
    2019-04-22
    缓存一致性问题,我们都是双删缓存。老师,读写锁的降级和单独使用有什么区别?或者说有什么优势?

    作者回复: 降级稍微快一点,而且一定能成功。

    
     4
  • iron_man
    2019-04-06
    王老师,写锁降级为读锁的话,前面的写锁是释放了么?后面可不可以讲一下这个读写锁的实现机制呢,这样可以对这种锁有更深入的理解,锁的升级降级也就不会用错了
    
     4
  • 刘志兵
    2019-04-08
    这里讲的读写锁和丁奇老师讲的mysql中的mdl锁和ddl锁原理好像是一样的,就是读写互斥,写写互斥,读读不互斥,老师讲的这个应该是读写锁的基本原理,mysql是这个锁的一种典型应用吧

    作者回复: 读写锁本身就是个通用的概念

    
     3
  • 密码123456
    2019-04-06
    系统停止了响应,说明线程可能被占满了。cpu利用率低为什么会推断出,是读锁升级为写锁?是因为锁升级后,线程都是等待状态吗?是不是cpu高是锁竞争?还有怎么验证读锁升级为写锁?

    作者回复: 系统停止了响应,cpu利用率低大概率是死锁了,没法推断,只能大胆假设,小心求证

    
     3
  • 无言的约定
    2019-12-05
    王老师,""如果一个写线程正在执行写操作,此时禁止读线程读共享变量"" 这句话反过来也成立,是不是意味着读操作和写操作是互斥的,不能同时进行?

    作者回复: 是的,只允许同时读

    
     2
  • 探索无止境
    2019-08-26
    老师你好,我们在项目开发中,如果要实现缓存,会直接采用Redis,感觉更合适,所以不太清楚,实际中ReadWriteLock可以解决哪些问题?

    作者回复: 本地缓存更快

    
     2
  • 疯狂咸鱼
    2019-08-08
    老师您好,我想问下锁的升级/降级有什么好处么?

    作者回复: 一个是出于性能的考虑,一个是防止数据的不一致

    
     2
  • 杨鹏程baci
    2019-07-01
    老师好,我来理解一下,我们对缓存这个例子来说,完全可以用volatile来达到可见性的目的,只是说用了读写锁支持读操作不用写回内存,可以并发执行,只是写操作还是需要每次保持可见性。我还有一个问题,读锁的意义是不是配合写锁时需要线程等待?
    
     2
  • Delong
    2019-06-08
    用jstack看是不是在waiting自己
    
     2
  • 老杨同志
    2019-04-06
    老师,如果读锁的持有时间较长,读操作又比较多,会不会一直拿不到写锁?

    作者回复: 不会一直拿不到,只是等待的时间会很长

     2
     2
  • 奔跑的蜗牛
    2019-12-19
    请教下老师,如果读多写少情况下,是否会存在写锁饿死的情况?如果用公平锁,是否会导致写锁很久才能获取到的情况呢?

    作者回复: 一般不会饿死,除非读锁异常导致释放不了。公平锁也不是导致写锁等待时间久的主要原因。

    
     1
我们在线,来聊聊吧