{"title":"Java 线程安全示例:使用 ReentrantLock 保护共享变量","description":"本文展示了一个使用 Java 编写的线程安全程序示例,使用 ReentrantLock 保护共享变量 j,避免多个线程同时访问导致的数据不一致问题。","keywords":"Java, 线程安全, ReentrantLock, 共享变量, 竞态条件, 数据不一致, 线程同步","content":""设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。考虑到线程的安全性写出程序内容:下面是一个使用 Java 编写的线程安全的程序示例:\n\njava\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\npublic class ThreadSafetyExample {\n private static int j = 0;\n private static final Lock lock = new ReentrantLock();\n\n public static void main(String[] args) {\n Thread incrementThread1 = new Thread(() -> {\n for (int i = 0; i < 10000; i++) {\n increment();\n }\n });\n\n Thread incrementThread2 = new Thread(() -> {\n for (int i = 0; i < 10000; i++) {\n increment();\n }\n });\n\n Thread decrementThread1 = new Thread(() -> {\n for (int i = 0; i < 10000; i++) {\n decrement();\n }\n });\n\n Thread decrementThread2 = new Thread(() -> {\n for (int i = 0; i < 10000; i++) {\n decrement();\n }\n });\n\n incrementThread1.start();\n incrementThread2.start();\n decrementThread1.start();\n decrementThread2.start();\n\n try {\n incrementThread1.join();\n incrementThread2.join();\n decrementThread1.join();\n decrementThread2.join();\n } catch (InterruptedException e) {\n e.printStackTrace();\n }\n\n System.out.println(\"Final value of j: \" + j);\n }\n\n private static void increment() {\n lock.lock();\n try {\n j++;\n } finally {\n lock.unlock();\n }\n }\n\n private static void decrement() {\n lock.lock();\n try {\n j--;\n } finally {\n lock.unlock();\n }\n }\n}\n\n\n在上述示例中,我们使用 ReentrantLock 来确保多个线程对共享变量 j 的访问是线程安全的。 increment()decrement() 方法都会先获取锁,然后执行相关操作,最后释放锁。这样可以确保同一时间只有一个线程能够修改 j 的值,从而避免了竞态条件和数据不一致的问题。最后,我们使用 join() 方法等待所有线程执行完毕,并输出最终的结果。\n\n"


原文地址: https://www.cveoy.top/t/topic/pvop 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录