多线程问题

并行工作者模型

在这里插入图片描述
多线程中的问题,主要是由于

  1. 任务顺序
  2. 共享资源

造成的。

竞态条件

当多个线程访问同一资源时,如果对资源的访问顺序敏感,则称存在竞态条件

导致竞态条件发生的代码区称做临界区

例:

  1. count++;

  2. 先检测后执行

    对于main线程,如果文件a不存在,则创建文件a,但是在判断文件a不存在之后,Task线程创建了文件a,这时候先前的判断结果已经失效,(main线程的执行依赖了一个错误的判断结果)此时文件a已经存在了,但是main线程还是会继续创建文件a,导致Task线程创建的文件a被覆盖、文件中的内容丢失等等问题。

死锁

M个线程、N个资源,相互等待对方资源。

避免:注意嵌套的同步块,不要试图在不同的对象上获取锁。

public class A {
    private String source1;
    private String source2;

    public A(String source1, String source2) {
        this.source1 = source1;
        this.source2 = source2;
    }

    public void doSomething() {
        synchronized (source1) {
            System.out.println("A synchronized source1 ...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (source2) {
                System.out.println("A synchronized source2 ...");
                System.out.println("A do something.");
            }
        }
    }
}
public class B {
    private String source1;
    private String source2;

    public B(String source1, String source2) {
        this.source1 = source1;
        this.source2 = source2;
    }

    public void doSomething() {
        synchronized (source2) {
            System.out.println("B synchronized source2 ...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (source1) {
                System.out.println("B synchronized source1 ...");
                System.out.println("B do something.");
            }
        }
    }
}
public class Client {
    public static void main(String[] args) {
        String source1 = "source1";
        String source2 = "source2";
        A a = new A(source1, source2);
        B b = new B(source1, source2);
        new Thread(() -> a.doSomething()).start();
        new Thread(() -> b.doSomething()).start();
    }
}

活锁

运行着,重复着无用功

尝试 - 失败 - 尝试 … 可能成功

饥饿

  1. 高优先级线程一直占着资源,低优先级线程饥饿
  2. 1个线程一直占着资源,其他线程饥饿
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值