Java多线程:竞态条件示例 原创 深藏阁楼爱情的钟 2024-11-12 05:48 4阅读 0赞 竞态条件(Race Condition)是指在多线程环境中,两个或多个线程访问共享数据时,它们的执行顺序会影响程序执行结果,而这个顺序是不可预测的。竞态条件可能导致数据不一致、程序崩溃等问题。 下面是一个简单的Java多线程竞态条件示例: ```javapublic class RaceConditionExample { private static int count =0; public static void main(String[] args) { Thread t1 = new Thread(() -> { for (int i =0; i <1000; i++) { increment(); } }); Thread t2 = new Thread(() -> { for (int i =0; i <1000; i++) { increment(); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Final count: " + count); } private static void increment() { count++; //这里存在竞态条件 } } ```在这个示例中,我们有两个线程`t1`和`t2`,它们都执行`increment()`方法1000次。`increment()`方法简单地将共享变量`count`加1。 问题在于,`count++`操作不是原子的,它包含以下步骤: 1.读取`count`的值2.将值加13.将新值写回`count` 当两个线程同时执行`increment()`方法时,它们可能会读取相同的`count`值,然后都加1并写回,导致`count`的值只增加了1,而不是预期的2。这就是竞态条件。 为了解决竞态条件,我们可以使用`synchronized`关键字来确保`increment()`方法在同一时间只能被一个线程访问: ```javaprivate static synchronized void increment() { count++; } ```或者使用`AtomicInteger`类来避免竞态条件: ```javaimport java.util.concurrent.atomic.AtomicInteger; public class RaceConditionExample { private static AtomicInteger count = new AtomicInteger(0); public static void main(String[] args) { Thread t1 = new Thread(() -> { for (int i =0; i <1000; i++) { increment(); } }); Thread t2 = new Thread(() -> { for (int i =0; i <1000; i++) { increment(); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Final count: " + count.get()); } private static void increment() { count.incrementAndGet(); } } ```在这个版本中,`AtomicInteger`确保`increment()`方法是原子的,从而避免了竞态条件。 文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...