AtomicInteger i = new AtomicInteger(0);
时间: 2023-11-15 17:02:05 浏览: 75
AtomicInteger是Java中的一个原子类,它提供了一种线程安全的方式来进行整数的操作。在多线程环境下,如果多个线程同时对同一个整数进行操作,可能会出现数据不一致的情况。而使用AtomicInteger可以避免这种情况的发生。在创建AtomicInteger对象时,可以指定初始值。在使用AtomicInteger时,可以使用get()方法获取当前值,使用set()方法设置新值,还可以使用一些方法进行原子操作,例如incrementAndGet()、decrementAndGet()等。在多线程环境下,使用AtomicInteger可以保证线程安全,避免数据不一致的问题。
范例:假设有一个计数器,多个线程同时对其进行操作,可以使用AtomicInteger来保证线程安全,代码如下:
AtomicInteger counter = new AtomicInteger(0);
// 线程1
counter.incrementAndGet();
// 线程2
counter.incrementAndGet();
// 线程3
counter.decrementAndGet();
相关问题
AtomicInteger i = new AtomicInteger();的作用
这段代码创建了一个原子整型对象 `i`,它的初始值为0。原子整型对象是多线程编程中的一个重要工具,它可以确保在多线程环境下对该对象的读写操作是原子的,即不会被其他线程中断或干扰。
在这个代码中,原子整型对象 `i` 可以被多个线程共享,并且可以用来表示某个状态或计数器。由于多个线程可能同时访问和修改该状态或计数器,如果使用普通的整型变量可能会导致线程安全问题,例如数据竞争和死锁等。而使用原子整型对象可以避免这些问题,从而提高程序的可靠性和稳定性。
此外,原子整型对象还提供了一些常用的方法,如 `get()` 方法可以获取当前值, `incrementAndGet()` 方法可以原子地将当前值加1并返回新值, `compareAndSet()` 方法可以原子地比较当前值和期望值,并在相等时将当前值设置为新值。这些方法可以方便地实现一些常见的线程安全操作,例如计数器、信号量等。
int corePoolSize = 2; int maxPoolSize = 5; long keepAliveSeconds = 5; BlockingQueue workQueue = new ArrayBlockingQueue(4); AtomicInteger threadId = new AtomicInteger(1); ThreadFactory factory = runnable -> new Thread(runnable, "thread-" + threadId.getAndIncrement()); ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveSeconds, TimeUnit.SECONDS, workQueue, factory); for (int i= 0 ; i< 10 ; i++ ) { int finalI = i; executor.submit(() -> { try { Thread.sleep(1000); } catch (InterruptedException ignored) { } System.out.println(Thread.currentThread().getName() + ":" + i); }); }
这段代码创建了一个线程池,其中包含2个初始线程,最多可扩展到5个线程。使用ArrayBlockingQueue作为工作队列,大小为4。使用AtomicInteger生成线程名称,并使用ThreadFactory创建新线程。创建了一个ThreadPoolExecutor实例,并将其用于提交10个任务。每个任务都会休眠1秒钟,然后将当前线程的名称和任务号打印到控制台。由于线程池中仅有2个初始线程,因此前2个任务将被立即执行。随着新任务的到来,线程池将创建更多线程。如果任务数量超过了工作队列的大小,那么新任务将被拒绝。在所有任务完成之后,线程池将等待5秒钟,然后关闭所有线程。
阅读全文