在 Java 多线程中使用 synchronized 关键字时没有得到想要的结果
Not getting desired result when using synchronized keyword in Java multithreading
我有两个文件,App.java
和 Runner.java
App.java
-->
public class App {
private static Thread thread1 = new Runner(1);
private static Thread thread2 = new Runner(2);
public static void main(String[] args) throws InterruptedException {
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.printf("Count = %d\n", Runner.getCount());
}
}
Runner.java
-->
public class Runner extends Thread {
private volatile static int count = 0;
private int option = 0;
private synchronized void increment() {
count++;
}
private synchronized void decrement() {
count--;
}
public Runner(int option) {
this.option = option;
}
public static int getCount() {
return count;
}
@Override
public void run() {
switch (option) {
case 1:
for (int i = 1; i <= 10000; i++) {
increment();
}
break;
case 2:
for (int i = 1; i <= 10000; i++) {
decrement();
}
break;
}
}
}
在这里,我试图从 main
thread
创建两个 threads
并从两个线程访问一个公共 variable
,其中 threads
将同时操纵这个普通的variable
。
我正在尝试为 synchronized
关键字的实施创建一个演示。
在我的示例中,在 Runner.java
-
我正在 Runner
class
child
class of Thread
使用 extends
keyword
和 overriding
正文中的run()
method
接下来,我使用 constructor
获取 option
并 运行 在 switch - case
run()
方法中使用相应的代码 block
。公共变量是 count
即 static
初始值为 0.
有两个methods
,都使用synchronized
keyword
- increment()
和decrement()
分别将count的值加1和减1 .
对于option 1
run()
方法使用for loop
到运行 increment()
10,000 次。
对于 option 2
run()
方法使用 for loop
到 运行 decrement()
10,000 次。
因此 count
的最终值应为 0。
在App.java
-
我正在创建两个 threads
- thread1
、thread2
,它们是 Runner class
的实例并传递 constructor
argument
1 和 2分别。
我正在 运行使用 thread.start()
连接两个 threads
并等待使用 thread.join()
完成两个 threads
现在,我正在打印 count
的值。该值应为 0。但事实并非如此。在每次执行中它接近于 0 但不是 0。
那么,我哪里出错了,如何更正我的代码?
count
是静态的,意味着只有一个这样的变量。
increment
和 decrement
都不是静态的,这意味着它们在 this
上同步 - 即两个单独的 Runner
实例。
将这些方法设为静态:
private synchronized static void increment() {
count++;
}
private synchronized static void decrement() {
count--;
}
或使用显式互斥对象:
private static int count = 0;
private static Object mutex = new Object;
private int option = 0;
private void increment() {
synchronized (mutex) {
count++;
}
}
private void decrement() {
synchronized (mutex) {
count--;
}
}
我有两个文件,App.java
和 Runner.java
App.java
-->
public class App {
private static Thread thread1 = new Runner(1);
private static Thread thread2 = new Runner(2);
public static void main(String[] args) throws InterruptedException {
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.printf("Count = %d\n", Runner.getCount());
}
}
Runner.java
-->
public class Runner extends Thread {
private volatile static int count = 0;
private int option = 0;
private synchronized void increment() {
count++;
}
private synchronized void decrement() {
count--;
}
public Runner(int option) {
this.option = option;
}
public static int getCount() {
return count;
}
@Override
public void run() {
switch (option) {
case 1:
for (int i = 1; i <= 10000; i++) {
increment();
}
break;
case 2:
for (int i = 1; i <= 10000; i++) {
decrement();
}
break;
}
}
}
在这里,我试图从 main
thread
创建两个 threads
并从两个线程访问一个公共 variable
,其中 threads
将同时操纵这个普通的variable
。
我正在尝试为 synchronized
关键字的实施创建一个演示。
在我的示例中,在 Runner.java
-
我正在 Runner
class
child
class of Thread
使用 extends
keyword
和 overriding
正文中的run()
method
接下来,我使用 constructor
获取 option
并 运行 在 switch - case
run()
方法中使用相应的代码 block
。公共变量是 count
即 static
初始值为 0.
有两个methods
,都使用synchronized
keyword
- increment()
和decrement()
分别将count的值加1和减1 .
对于option 1
run()
方法使用for loop
到运行 increment()
10,000 次。
对于 option 2
run()
方法使用 for loop
到 运行 decrement()
10,000 次。
因此 count
的最终值应为 0。
在App.java
-
我正在创建两个 threads
- thread1
、thread2
,它们是 Runner class
的实例并传递 constructor
argument
1 和 2分别。
我正在 运行使用 thread.start()
连接两个 threads
并等待使用 thread.join()
threads
现在,我正在打印 count
的值。该值应为 0。但事实并非如此。在每次执行中它接近于 0 但不是 0。
那么,我哪里出错了,如何更正我的代码?
count
是静态的,意味着只有一个这样的变量。
increment
和 decrement
都不是静态的,这意味着它们在 this
上同步 - 即两个单独的 Runner
实例。
将这些方法设为静态:
private synchronized static void increment() {
count++;
}
private synchronized static void decrement() {
count--;
}
或使用显式互斥对象:
private static int count = 0;
private static Object mutex = new Object;
private int option = 0;
private void increment() {
synchronized (mutex) {
count++;
}
}
private void decrement() {
synchronized (mutex) {
count--;
}
}