◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
多线程访问成员变量问题
当有多个线程同时访问共享成员变量时,如果没有采取同步机制,就会导致线程安全问题。以某个成员变量 temp 为例,在有多个线程同时对其进行修改时,不同的线程可能会读到尚未更新的值。
问题:
程序中使用 executorservice 创建了 100 个线程,每个线程启动后都执行一个 test2 线程。每个 test2 线程在休眠 1 秒后,对 test3 类的成员变量 temp 进行修改,然后输出修改后的值。虽然每个线程都应修改不同的 temp 值,但实际上打印的结果却是相同的。
原因:
问题的原因在于线程在访问和修改 temp 值时未进行同步。当多个线程同时访问 temp 时,由于 java 中变量赋值不是原子性操作,会导致线程读到不一致的值。
解决方案:
为了解决这个问题,需要使用同步机制来确保每个线程在访问和修改 temp 值时是原子的。可以在 test2 线程的 run 方法中使用 synchronized 关键字将访问和修改 temp 的代码块包围起来,从而确保每次只有一个线程可以执行这些操作:
@Override public void run() { Test3 test3 = Test3.getInstance(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (test3) { test3.temp = test3.temp + 1; System.out.println(test3.temp); } }
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。