并发编程——上线文切换、死锁

1、什么是线程上线文切换

时间片是CPU分配给线程执行的时间,由于时间片非常短,所以CPU通过不停切换线程执行。时间片时长一般几十毫秒。

在切换线程前会保存当前任务线程的状态,以便下次再切回这个任务时可以再加载这个任务 的状态。任务从保存到再次加载的过程是一次上线文切换

2、死锁

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。

public class DeadLock {
    private final Object left = new Object();
    private final Object right = new Object();

    public static void main(String[] args) {
        int n = 10;
        DeadLock deadLock = new DeadLock();
        for (int i = 0; i < n; i++) {

            deadLock.deadLock();
        }
    }

    public void deadLock() {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (left) {
                    System.out.println("hello left,i need right,so ...");
                    synchronized (right) {
                        System.out.println("hello right,i am come in.");
                    }
                }
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (right) {
                    System.out.println("hello right,i need left,so ...");
                    synchronized (left) {
                        System.out.println("hello left,i am come in.");
                    }
                }
            }
        });

        threadA.start();
        threadB.start();
    }


}

避免死锁的方法:

  • 避免一个线程同时获取多个锁;
  • 避免一个线程在锁内同时占用多个资源,尽量保证一个线程占用一个资源。
  • 尝试使用定时锁,使用lock.tryLock(timeout) 替代使用内部锁机制;
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

 

参考:《JAVA并发编程的艺术》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值