Java中线程同步问题:wait()和notify()的不当使用案例

原创 怼烎@ 2024-12-03 16:30 76阅读 0赞

在Java中,线程同步主要依赖于synchronized关键字。wait()和notify()是Object类中的方法,主要用于线程间的通信。

以下是一些不当使用wait()和notify()的案例:

  1. 无锁竞态

    1. class Counter {
    2. int count;
    3. synchronized void increment() {
    4. while (count > 0) { // 错误,应为count <= 0
    5. if (!this.wait(1)) { // 忽略异常
    6. break;
    7. }
    8. }
    9. count++;
    10. }
    11. }

    此处无锁竞态导致程序错误。应使用count <= 0作为条件。

  2. 无限循环

    1. class Test {
    2. void infiniteWait() {
    3. synchronized (this) {
    4. if (true) { // 确保进入等待状态
    5. this.notifyAll();
    6. // 忽略return语句,导致无限循环
    7. }
    8. }
    9. }
    10. }

    此处的无限循环是由于调用notifyAll()后没有正确退出等待状态导致的。

  3. 未同步访问共享资源

    1. class Counter {
    2. int count;
    3. // 未同步访问count,可能导致数据不一致
    4. public void increment() {
    5. count++;
    6. }
    7. }

    此处应确保increment()方法在同步内部调用以保证数据一致性。

综上所述,使用wait()和notify()时需要注意锁的正确管理,避免无锁竞态、无限循环以及未同步访问共享资源等问题。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读