如何使用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中的函数的详细内容,更多请关注其它相关文章!