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