如何使用synchronized修饰符定义Java中的函数

如何使用synchronized修饰符定义java中的函数

如何使用 synchronized 修饰符定义 Java 中的函数

何时使用 synchronized

synchronized 修饰符用于防止多线程同时访问特定方法或代码块,确保它们按顺序执行。这在多线程环境中尤为重要,避免出现一个线程修改数据时,另一个线程同时访问这些数据导致数据损坏。

用法

在方法签名之前添加 synchronized 关键字,如下所示:

public synchronized void synchronizedMethod() {
    // 方法代码
}

实战案例

考虑以下共享变量 counter 的多线程程序:

public class Counter {
    private int counter = 0;

    public void increment() {
        counter++;
    }
}

现在,考虑以下测试类,通过创建 multiple 线程同时调用 increment 方法来测试 Counter 类:

public class TestCounter {

    public static void main(String[] args) {
        Counter counter = new Counter();

        // 创建并启动 10 个线程
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.increment();
                }
            }).start();
        }

        // 等待所有线程完成
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 打印最终 counter 值
        System.out.println("最终 counter 值:" + counter.counter);
    }
}

由于并发访问 counter,输出结果可能不正确,因为多个线程可能同时尝试修改 counter 的值。

为了解决这个问题,可以在 increment 方法上使用 synchronized 修饰符,如下所示:

public class Counter {

    private int counter = 0;

    public synchronized void increment() {
        counter++;
    }
}

当并发线程调用 increment 方法时,synchronized 修饰符会确保它们按顺序执行,避免数据竞争。

重新运行 TestCounter 类会产生预期的输出,显示正确的 counter 值,例如:

最终 counter 值:10000

以上就是如何使用synchronized修饰符定义Java中的函数的详细内容,更多请关注其它相关文章!