返回

用最简短的话让你一眼认清死锁与线程安全

后端

死锁与线程安全是并发编程中两个最常见的错误。死锁是指两个或多个线程因为互相等待而导致无法继续执行的情况。线程安全是指当多个线程同时访问共享数据时,不会导致数据损坏的情况。

今天我们用最简短的话让你一眼认清死锁与线程安全!

死锁的例子

public class Deadlock {

    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void method1() {
        synchronized (lock1) {
            System.out.println("method1 lock1");
            synchronized (lock2) {
                System.out.println("method1 lock2");
            }
        }
    }

    public void method2() {
        synchronized (lock2) {
            System.out.println("method2 lock2");
            synchronized (lock1) {
                System.out.println("method2 lock1");
            }
        }
    }

    public static void main(String[] args) {
        Deadlock deadlock = new Deadlock();
        new Thread(deadlock::method1).start();
        new Thread(deadlock::method2).start();
    }
}

线程安全的例子

public class ThreadSafe {

    private int count = 0;

    public void increment() {
        synchronized (this) {
            count++;
        }
    }

    public int getCount() {
        synchronized (this) {
            return count;
        }
    }

    public static void main(String[] args) {
        ThreadSafe threadSafe = new ThreadSafe();
        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                threadSafe.increment();
            }
        }).start();
        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                threadSafe.increment();
            }
        }).start();
        System.out.println(threadSafe.getCount()); // 20000
    }
}

总结

死锁是指两个或多个线程因为互相等待而导致无法继续执行的情况。线程安全是指当多个线程同时访问共享数据时,不会导致数据损坏的情况。

为了避免死锁,我们可以使用锁来同步线程的访问。为了保证线程安全,我们可以使用原子操作或锁来保护共享数据。