• 糖醋🏀
    2019-09-01
    java7开始io就有try-with-resource。
    可以利用这一个特性,来说实现,自动释放。
    代码如下:

    public class AutoUnlockProxy implements Closeable {

        private Lock lock;

        public AutoUnlockProxy(Lock lock) {
            this.lock = lock;
        }

        @Override
        public void close() throws IOException {
            lock.unlock();
            System.out.println("释放锁");
        }

        public void lock() {
            lock.lock();
        }

        public void tryLock(long time, TimeUnit unit) throws InterruptedException {
            lock.tryLock(time, unit);
        }

        public static void main(String[] args) {

            try (AutoUnlockProxy autoUnlockProxy = new AutoUnlockProxy(new ReentrantLock())) {
                autoUnlockProxy.lock();
                System.out.println("加锁了");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
    展开

    作者回复: 👍👍👍

     3
     17
  • shenbinzhuo
    2019-09-08
    既然是消息队列自然要多讲讲消息队列的知识,一下io,一下缓存,一下多线程,讲的很杂,也不深入。
     5
     9
  • humor
    2019-09-01
    /**
    *业务调用接口
    **/
    public interface Invoker{
        void invoke();
    }

    /**
    *try-with-lock
    **/
    public class RLock{
        private Lock lock = new ReentrantLock();

        public void run(Invoker invoker) {
            lock.lock();
            try{
                invoker.invoke();
            } finally{
                lock.unlock();
            }
        }
    }

    public BizInvoker implements Inoker{
        private RLock rLock = new RLock();
        public void invoke() {
            //需要加锁的业务逻辑
        }

        public static void main(String[] args) {
            rLock.run(new BizInvoker());
        }
    }
    展开

    作者回复: 👍👍👍

    
     3
  • L!en6o
    2019-08-31
    加一个锁回调 封装起来 实现 try-with-lock
    
     3
  • 张三
    2019-08-31
    幸亏学过极客时间的并发编程专栏,看懂了。我觉得并发容器的选择比较复杂。
    
     3
  • Switch
    2019-10-24
    try with resource实现
    传入参数实现

    https://github.com/Switch-vov/mq-learing/tree/master/src/main/java/com/switchvov/lock
    
     1
  • Cast
    2019-09-01
    老师,请问为什么要按逆序去释放锁呢?按照获取的顺序去释放好像也没什么毛病吧?

    作者回复: 如果释放几把锁的过程中,不再有其它加锁的代码,正序释放也是没问题的。

    逆序释放只是一种习惯,让代码的结构更清晰。

     1
     1
  • 往事随风,顺其自然
    2020-02-07
    十八般武器全用上,队列还是多讲些深入的知识
    
    
  • 道
    2020-02-03
    阻塞队列能够解决大部分并发访问的问题,Golang对他就提供了语言层面的支持,为何现实中用的不多哩?

    作者回复: 还是要看具体的使用场景。

    
    
  • 小伟
    2020-01-22
    课后作业:https://github.com/ToddSAP/Geektime/tree/master/src/mqmaster/course17
    两种方法:
    1. 接口代理:代码有入侵
    2. AOP:可做到代码无入侵
    
    
  • 文正
    2019-11-17
    一般情况下,如果业务场景需要调用多个锁,应该将这几把锁归放到一个盒子里面。加锁解锁的条件,在定义锁的时候就规定好。比如,拿到B锁的条件是必须已经拿到A锁。这样可以有效的避免人为的失误。
    
    
  • 长期规划
    2019-10-08
    避免死锁
    1。锁最好不要嵌套,如果实在需要嵌套,要按2的顺序
    2。所有锁的地方都按相同的顺序加锁。比如有A,B,C,D四把锁,所有加锁的地方的顺序都是A→B→C→D,或者是其切片,比如线程1使用B→C,线程2使用A→B,线程3使用C→D
    3。解锁顺序最好和加锁顺序相反,这样逻辑清晰,锁不用后一定要释放
    
    
  • 长期规划
    2019-10-08
    老师,只要保证所有使用锁的地方都按相同的顺序获取,而且按获取的顺序的反序解锁,应该就不会发生死锁了吧。

    作者回复: 即使是这样也不能完全保证没有死锁。

     1
    
  • 长期规划
    2019-10-08
    那个读写锁,读锁和写锁之间应该也是互斥的吧

    作者回复: 是的,只有读锁之间是共享的。

    
    
  • 陈凯
    2019-10-08
    干货满满👍
    
    
  • godtrue
    2019-09-24
    学过宝令老师的并发编程,再看老师这个感觉很轻松,不过毕竟专栏主题所限,宝令老师整个专栏都在讲并发编程更加系统和专业。
    JAVA中实现一个try-with-lock,思路有两个:
    1:注解
    2:代理,静态或动态
    
    
  • 明日
    2019-09-03
    请问老师这种在new 对象过程中锁定共享锁的方式是否可行
     代码: https://gist.github.com/imgaoxin/91234a9edbf083b10244221493ce7fb5

    作者回复: 这样做应该是可以的。

    
    
  • 刘天鹏
    2019-09-02
    对于golang应该就是这样吧
    func foo(){
      lock.Lock()
      defer lock.Unlock()
      //do something...
    }
    展开

    作者回复: 是的。

    
    
  • 你说的灰
    2019-09-02

    public void visitShareResWithLock() {
      lock.lock();
      try {
        // 在这里安全的访问共享资源
      } finally {
        lock.unlock();
      }
    }

     lock.lock(); 加锁语句放在 try catch 里面是否可以。为什么很多示例代码都放在外面。
    展开

    作者回复: 放到try之后的第一句也是可以的。

     1
    
  • 游弋云端
    2019-09-01
    ABBA锁最容易出问题,老师的经验很重要,尽可能避免锁中锁。
    
    
我们在线,来聊聊吧