首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >并发挑战(二)

并发挑战(二)

作者头像
Java架构师必看
发布2021-05-14 10:24:39
发布2021-05-14 10:24:39
2670
举报
文章被收录于专栏:Java架构师必看Java架构师必看

并发挑战(二)

强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

死锁

锁是一个很有用的工具,运用的场景也多,使用也简单,但是,锁使用不当也会出现一系列维妮塔,比如说:死锁,一旦产生死锁,会造成系统功能无法使用。 例如:

代码语言:javascript
复制
public class DeadLockDemo {
    private static String A = "A";
    private static String B = "B";
    private void deadLock(){
        Thread t1 = new Thread(()->{
           synchronized (A) {
               try {
                   Thread.currentThread().sleep(2000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               synchronized (B) {
                   System.out.println("1");
               }
           }
        });
        Thread t2 = new Thread(()->{
           synchronized (B){
               synchronized (A){
                   System.out.println("2");
               }
           }
        });
        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
        new DeadLockDemo().deadLock();
    }
}

在这段代码中,t1和t2互相等待对方释放锁资源,造成了程序死锁 上述这段代码只是演示了,死锁的场景,在现实生活中,不会这样去写代码,但是在一些复杂的场景中,可能会遇到这样的问题,如:t1拿到锁之后,由于一些原因或者异常没有释放锁(死循环)抑或t1拿到的是数据库锁,释放锁的时候,抛出异常,没有释放掉。 一旦出现死锁,业务层是可以感知到的。 避免死锁的几个常见方法

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
  • 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则可能会出现解锁失败的情况
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 死锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档