欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java并发编程的艺术-学习笔记(1)

程序员文章站 2022-05-04 10:09:28
...

第一章-并发编程的挑战

  1. 上下文切换
    CPU通过时间片算法来循环执行任务,当前任务执行一个时间片会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便于下次切换回这个任务时,可以再次加载这个任务的状态。从任务的保存到在加载就是一次上下文切换
    CPU是通过给每个线程分配cpu时间片来实现多线程的,时间片特别短,一般为几十毫秒,cpu通过不同的切换线程,让我们感觉到多线程是同时工作的。
  2. 如何减少上下文切换
    无所并发编程:多线程竞争锁,会引起上下文切换, 所以要避免使用锁
    CAS算法:Java中的Atomic包使用CAS来更新数据,不需要加锁
    使用最少线程:避免创建不需要的线程
    协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的调度(?)
public class DeadLockDemo {
    private static String A = "A";
    private static String B = "BA";

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

    public  static void dedaLock() {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A) {
                    try {
                        Thread.sleep(2000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    synchronized (B) {
                        System.out.println("1");
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
            synchronized (B){
                synchronized (A){
                    System.out.println("2");
                }
            }
            }
        });
        t1.start();
        t2.start();

    }
}

上面代码演示了死锁的场景,AB互相等待对方释放锁。通过dump可以看到
java并发编程的艺术-学习笔记(1)
java并发编程的艺术-学习笔记(1)
以上信息告诉我们在33和22行代码发生了死锁。
3.避免死锁的方法
避免一个线程同时获取多个锁
避免一个线程在锁内同时占有多个资源,尽量保证每个锁只占有一个资源
尝试使用定时锁,使用Lock.tryLock来替代使用内部锁机制