美文网首页
原子性和易变性2

原子性和易变性2

作者: 桐桑入梦 | 来源:发表于2020-03-09 17:19 被阅读0次
package concurrency;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

class CircularSet{
    private int[] array;
    private int len;
    private int index = 0;

    public CircularSet( int size ){
        array = new int[size];
        len = size;
        for( int i = 0; i < size; i++ )
            array[i] = -1;
    }

    public synchronized void add( int item ){
        array[index] = item;
        index = ++index % len;
    }

    public synchronized boolean contains( int val ){
        for( int i = 0; i < len; i++ ) {
            if( array[i] == val )
                return true;
        }
        return false;
    }
}

public class SerialNumberChecker {
    private static int SIZE = 10;
    private static CircularSet serials = new CircularSet(1000);
    private static ExecutorService exec = Executors.newCachedThreadPool();

    static class SerialChecker implements Runnable{
        @Override
        public void run(){
            while( true ){
                int serial = SerialNumberGenerator.nextSerialNumber();
                if( serials.contains( serial ) ){
                    System.out.println( "Duplicate: " + serial );
                    System.exit( 0 );
                }
                serials.add( serial );
            }
        }
    }

    public static void main(String[] args) throws Exception {
        for( int i = 0; i < SIZE; i++ ){
            exec.execute( new SerialChecker() );
        }

        if( args.length > 0 ){
            TimeUnit.SECONDS.sleep( Integer.parseInt(args[0]) );
            System.out.println( "No duplicates detected" );
            System.exit( 0 );
        }
    }
}

运行的结果:



问题:第一个出现重复数字的线程执行了System.exit( 0 ),那么终止了JVM的运行,为什么会输出那么多的数字?

因为在System.exit( 0 )没有在发现重复数字之后立即执行,导致输出了很多数字。这里使用一个加锁的static方法重写:

package concurrency;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

class CircularSet{
    private int[] array;
    private int len;
    private int index = 0;

    public CircularSet( int size ){
        array = new int[size];
        len = size;
        for( int i = 0; i < size; i++ )
            array[i] = -1;
    }

    public synchronized void add( int item ){
        array[index] = item;
        index = ++index % len;
    }

    public synchronized boolean contains( int val ){
        for( int i = 0; i < len; i++ ) {
            if( array[i] == val )
                return true;
        }
        return false;
    }
}

public class SerialNumberChecker {
    private static int SIZE = 10;
    private static CircularSet serials = new CircularSet(1000);
    private static ExecutorService exec = Executors.newCachedThreadPool();

    static class SerialChecker implements Runnable{
        @Override
        public void run(){
            while( true ){
                int serial = SerialNumberGenerator.nextSerialNumber();
                if( serials.contains( serial ) ){
                    printf( serial );
                }
                serials.add( serial );
            }
        }

        public static synchronized void printf( int serial ){
            System.out.println( "Duplicate: " + serial );
            System.exit( 0 );
        }
    }

    public static void main(String[] args) throws Exception {
        for( int i = 0; i < SIZE; i++ ){
            exec.execute( new SerialChecker() );
        }

        if( args.length > 0 ){
            TimeUnit.SECONDS.sleep( Integer.parseInt(args[0]) );
            System.out.println( "No duplicates detected" );
            System.exit( 0 );
        }
    }
}
期望的运行结果

相关文章

  • 原子性和易变性2

    运行的结果: 问题:第一个出现重复数字的线程执行了System.exit( 0 ),那么终止了JVM的运行,为什么...

  • 原子性和易变性

    当一个域的值依赖于它之前的值时候,那么volatile也无法正常的工作。这里的i++就是这样,i++即 i = i...

  • 有趣的知识点

    看到行为的归因,分别有几种方式: 1.内归因和外归因 2.可控性和不可控性 3.稳定性和易变性 很多时候自己做事情...

  • 可见性,原子性,不变性

    可见性 当一个线程修改了对象状态后,其他线程能够看到发生的状态变化 如何保证? 加锁,当线程B执行由锁保护的同步代...

  • 存在的永恒性和易变性

    存在的是永恒的,变化是一种存在转变为另一种存在,如此前一种存在必然化作虚无。但是存在和虚无对立,存在并非虚无,所以...

  • 阿里面试题(题目来源网络)

    如何保证线程安全?从那几个角度入手。 原子性可见性不变性 synchronized与lock的区别,使用场景。sy...

  • iOS 属性关键字

    1.atomic(原子性),可以理解为事物的四个特性中的原子性,保证线程安全。 2.nonatomic (非原子性...

  • ARC 属性@property(总结《Effective Obj

    属性特质分为4种 1、原子性 2、读写权限 3、内存管理语义 4、方法名 1、原子性(2种)(1)atomic(默...

  • 混凝土拌合物的和易性和混凝土的强度

    知识点:【掌握】混凝土拌合物的和易性和混凝土的强度 一、混凝土拌合物的和易性 1、和易性包括流动性、黏聚性和保水性...

  • volatile关键字

    并发编程 并发编程三个特性: 1:原子性:synchronized 可以保证代码片段的原子性。 2:可见性:如果一...

网友评论

      本文标题:原子性和易变性2

      本文链接:https://www.haomeiwen.com/subject/hsgpdhtx.html