JAVA : 如何查看同步线程计数器和普通线程计数器之间的输出差异?
JAVA : How to see the difference in output between a synchronized and normal thread counter?
我正在尝试了解线程同步。我已经实现了一个初始值为 0 的计数器。10 个线程每个将计数器递增 10 次。我猜下面代码的输出一定不是 100,因为我还没有同步它。但是,无论我是否同步 Counter.java 中的 incrementCount 方法,我总是将最终计数设为 100。有人可以解释一下我怎么会因为不同步而看到错误的输出吗?
package practise.java;
public class Counter {
private int count = 0;
public int getCount()
{
return count;
}
public void incrementCount()
{
count++;
}
}
package practise.java;
public class SharedCounter1 extends Thread{
Counter counter;
public SharedCounter1(Counter c)
{
counter = c;
}
@Override
public void run() {
for(int i = 0;i<10;i++)
{
//System.out.println(this.getName() + "previous count :: "+counter.getCount());
counter.incrementCount();
//System.out.println("after incrementing ::: "+counter.getCount());
}
}
public static void main(String[] args)
{
Counter c = new Counter();
for(int i=0;i<10;i++)
{
System.out.println(i+"th thread starting");
SharedCounter1 s= new SharedCounter1(c);
s.start();try {
s.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Final Value::: "+c.getCount());
}
}
您的线程是按顺序执行的:
s.start();
try {
s.join();
你开始一个 thread
,你等到它完成然后你开始下一个 thread
。你应该启动所有线程然后等到所有线程都完成
我正在尝试了解线程同步。我已经实现了一个初始值为 0 的计数器。10 个线程每个将计数器递增 10 次。我猜下面代码的输出一定不是 100,因为我还没有同步它。但是,无论我是否同步 Counter.java 中的 incrementCount 方法,我总是将最终计数设为 100。有人可以解释一下我怎么会因为不同步而看到错误的输出吗?
package practise.java;
public class Counter {
private int count = 0;
public int getCount()
{
return count;
}
public void incrementCount()
{
count++;
}
}
package practise.java;
public class SharedCounter1 extends Thread{
Counter counter;
public SharedCounter1(Counter c)
{
counter = c;
}
@Override
public void run() {
for(int i = 0;i<10;i++)
{
//System.out.println(this.getName() + "previous count :: "+counter.getCount());
counter.incrementCount();
//System.out.println("after incrementing ::: "+counter.getCount());
}
}
public static void main(String[] args)
{
Counter c = new Counter();
for(int i=0;i<10;i++)
{
System.out.println(i+"th thread starting");
SharedCounter1 s= new SharedCounter1(c);
s.start();try {
s.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Final Value::: "+c.getCount());
}
}
您的线程是按顺序执行的:
s.start();
try {
s.join();
你开始一个 thread
,你等到它完成然后你开始下一个 thread
。你应该启动所有线程然后等到所有线程都完成