希望使用volatile和synchronized关键字在java中开发计数器功能,从而获得意外的结果 公共接口计数器{ 无效增量(); int getCount(); } 公共类SynchronizedCounter实现计数器{ 易失性整数计数=0; 公共同步的无效增量(){ 计数++; } public int getCount(){ 返回计数; } } 公共类多线程操作{ 公共静态void main(字符串[]args){ 计数器计数器=新的同步计数器(); 对于(int i=0;i{ counters.increment(); System.out.println(Thread.currentThread()+“count=>” +counters.getCount()); }).start(); } } }
使用volatile和synchronized测试概念时,下面是输出希望使用volatile和synchronized关键字在java中开发计数器功能,从而获得意外的结果 公共接口计数器{ 无效增量(); int getCount(); } 公共类SynchronizedCounter实现计数器{ 易失性整数计数=0; 公共同步的无效增量(){ 计数++; } public int getCount(){ 返回计数; } } 公共类多线程操作{ 公共静态void main(字符串[]args){ 计数器计数器=新的同步计数器(); 对于(int i=0;i{ counters.increment(); System.out.println(Thread.currentThread()+“count=>” +counters.getCount()); }).start(); } } },java,multithreading,Java,Multithreading,使用volatile和synchronized测试概念时,下面是输出 public interface Counters { void increment(); int getCount(); } public class SynchronizedCounter implements Counters { volatile int count = 0; public synch
public interface Counters {
void increment();
int getCount();
}
public class SynchronizedCounter implements Counters {
volatile int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
public class MultiThreadedOperation {
public static void main(String[] args) {
Counters counters = new SynchronizedCounter();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
counters.increment();
System.out.println(Thread.currentThread() + " count => "
+ counters.getCount());
}).start();
}
}
}
线程[Thread-0,5,main]计数=>3
线程[Thread-3,5,main]计数=>4
线程[Thread-2,5,main]计数=>3
线程[Thread-1,5,main]计数=>3
线程[Thread-5,5,main]计数=>5
线程[Thread-4,5,main]计数=>6
线程[Thread-8,5,main]计数=>8
线程[Thread-7,5,main]计数=>9
线程[Thread-9,5,main]计数=>9
线程[Thread-6,5,main]计数=>10
使用Java 8和eclipse Id Luna时,不同线程的某些计数值是相同的,请建议为什么您希望每个线程看到不同的计数值?假设您只有2个线程,线程1碰巧获得了锁并调用了
increment
,那么锁就被释放了。在线程1可以再次获取锁之前,线程2碰巧获取了锁并调用increment
。现在,当两个线程调用getCount
时,它们将得到相同的数字getCount()
相对于increment()
不是原子的。如果您想要线程分配的值,为什么不使用increment方法return++count代码>?感谢所有人都会更正我的代码了解了当前行为如果您使increment返回它的增量值并打印出来,您将实际看到您期望的行为。这是因为增量和获取是原子的。
Thread[Thread-0,5,main] count => 3
Thread[Thread-3,5,main] count => 4
Thread[Thread-2,5,main] count => 3
Thread[Thread-1,5,main] count => 3
Thread[Thread-5,5,main] count => 5
Thread[Thread-4,5,main] count => 6
Thread[Thread-8,5,main] count => 8
Thread[Thread-7,5,main] count => 9
Thread[Thread-9,5,main] count => 9
Thread[Thread-6,5,main] count => 10