学习笔记(1)----一道关于线程面试题的思考

该博客讨论了一个可能导致死锁的代码片段,并提出了优化建议。作者指出,在同步块中使用while循环会导致死锁,因为当条件不满足时线程会被永久阻塞。正确的做法是将synchronized块放在循环之外,并避免在不必要的地方使用同步。此外,还提到了可以使用Semaphore、FixedThreadPool或其他全局变量来避免此类问题,同时强调了锁细化和粗化的概念。
摘要由CSDN通过智能技术生成

题解:

1.

public void handle(int threadNum) throws InterruptedException {

        int localCurrent = 0;

        while (true) {

            synchronized (this) {

                if (current < max) {

                    current++;

                    localCurrent = current;

                    break;

                }

            }

        }

        this.doHandle(threadNum, localCurrent);

        synchronized (this) {

            current--;

        }

    }

2.

3.

学到的知识:题外可以用semphore、fixthreadpool或者设置全局变量等等解决

一些锁粗化和细化的东西:1.在while里面写synchronized,而不是在synchronized里面写while。2.doHandle的调用不需要写在synchronized里面

错误题解

导致的问题:死锁 你这个问题就出在在synchronized里面while,你先锁了this,然后才循环判断curr,然而如果此时已经达到max,你就永远锁在里面出不来了,主要是因为和notify公用锁了。

object里面也没有lock方法。

著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoLongerConfused

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值