Java并发编程的艺术-01-并发编程的挑战

并发编程的目的是为了让程序运行的更快

知识点汇总

  • 并非启动更多线程程序并发就最大
  • 多线程不一定就快,线程的创建和上下文切换需要成本
  • 减少上下文切换
    • 无锁并发 - 通过ID将数据分开
    • CAS算法; 使用Java的Atomic包
    • 使用最少线程;避免创建不必要的线程导致太多线程等待

死锁示例

下面的示例一般不会出现在大家的代码中,只做展示。

很多面试会有考死锁,简单来说当线程同时需要获取多个锁就很容易出现死锁

public class DeadLock {
    public static String A = "A";
    public static String B = "B";    
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {            
            @Override
            public void run() {
                synchronized (A) {
                    System.out.println("T1 Locked A");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B) {
                        System.out.println("T1 Locked B");
                    }
                }
            }
        });

        Thread t2 =new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized (B) {
                    System.out.println("T2 Locked B");
                    synchronized (A) {
                        System.out.println("T2 Locked A");
                    }
                }
            }
        });


        t1.start();
        t2.start();
    }

}

避免死锁的出现

  • 避免一个线程同时获取多个锁

资源限制

当资源(cpu)的利用率已经很高,达到或者接近100%的时候,增加线程反而导致程序运行的更慢。

最后更新于 3rd Nov 2022