java多线程编程之使用Synchronized关键字同步类方法


在Java中,`synchronized` 关键字可以用于同步类方法,以确保在同一时刻只有一个线程可以执行该方法。这对于防止多线程环境下对共享资源的并发访问冲突非常有用。

以下是一个使用 `synchronized` 关键字同步类方法的示例:


public class Counter {
    // 私有共享资源
    private int count = 0;

    // 使用 synchronized 同步类方法
    public synchronized void increment() {
        count++; // 假设这是一个复杂的操作,需要同步
    }

    // 另一个方法,为了展示不是所有方法都需要同步
    public void display() {
        System.out.println("Current count is: " + count);
    }

    public static void main(String[] args) {
        // 创建Counter对象
        Counter counter = new Counter();

        // 创建两个线程来模拟并发
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        // 启动线程
        t1.start();
        t2.start();

        // 等待线程完成
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 显示最终结果
        counter.display();
    }
}

在这个示例中,`increment` 方法被声明为 `synchronized`,这意味着在同一时刻,只有一个线程可以执行这个方法。这确保了 `count` 变量的更新是线程安全的,即使在多个线程同时尝试修改它的情况下。而 `display` 方法则没有被同步,因为它只是读取 `count` 的值,并且读取操作在大多数情况下是线程安全的(尽管在复杂的并发场景中,可能需要其他形式的同步来确保数据的可见性)。

请注意,虽然 `synchronized` 方法提供了线程安全的保障,但它也可能引入性能瓶颈,因为每次只有一个线程可以执行该方法。在设计多线程程序时,应该仔细考虑何时以及如何应用同步机制。