使用 synchronized、AtomicInteger 和 ReentrantLock 的简单示例

lys2023年12月04日 0条评论
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SynchronizationDemo {
    private static int count = 0;
    private static AtomicInteger atomicCount = new AtomicInteger(0);
    private static Lock lock = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
        // 创建多个线程进行增加操作
        Thread[] threads = new Thread[5];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(() -> {
                // 使用 synchronized 关键字保证线程安全
                synchronized (SynchronizationDemo.class) {
                    count++;
                    System.out.println("Count: " + count);
                }
                // 使用 Atomic 原子类保证线程安全
                int newValue = atomicCount.incrementAndGet();
                System.out.println("Atomic Count: " + newValue);

                // 使用 ReentrantLock 实现线程安全
                lock.lock();

                                try {
                    count++;
                    System.out.println("Lock Count: " + count);
                } finally {
                    lock.unlock();
                }
            });
            threads[i].start();
        }

        // 等待所有线程执行完毕
        for (Thread thread : threads) {
            thread.join();
        }
    }
}

在上述示例中,我们创建了多个线程对 count 进行增加操作。使用 synchronized 关键字保证了 count 的线程安全性,而 AtomicInteger 类提供了原子操作来保证 atomicCount 的线程安全性。另外,使用 ReentrantLock 实现了对 count 的线程安全访问。

请注意,这只是一个简单的示例,以展示不同的同步机制。在实际应用中,需要根据具体的需求和场景选择合适的同步机制。

哪种同步机制比较好,需要根据具体的需求和场景来选择。

上述方法哪种比较好?

synchronized 关键字使用简单,可以保证线程安全,但是可能会出现死锁或性能问题。Atomic 类提供了原子操作,可以在没有显式锁的情况下实现线程安全,但是只能用于基本类型数据的原子操作,并且对复杂的操作不够灵活。Lock 接口及其实现类提供了更高级别的同步机制,可以手动控制锁的获取和释放,并提供更高级别的功能,例如可重入锁、公平锁等,但是相对于简单的 synchronized 关键字,它们可能需要更多的编码和维护工作。

因此,在选择使用何种同步机制时,需要根据具体情况和需求来进行权衡。一般来说,如果只是简单的线程同步,使用 synchronized 关键字已经足够。如果需要进行更细粒度的控制或者有特殊的需求,可以考虑使用 Atomic 类或者 Lock 接口及其实现类。