Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
希望使用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 - Fatal编程技术网

希望使用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关键字在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

使用volatile和synchronized测试概念时,下面是输出

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