当前位置: 首页 > 图灵资讯 > 技术篇> 如何使用synchronized修饰符定义Java中的函数

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

来源:图灵教育
时间:2024-09-29 20:59:17

如何使用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 类:

立即学习“Java免费学习笔记(深入);

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中函数定义的详细内容。请关注图灵教育的其他相关文章!