原子变量
java.util.concurrent.atomic包定义了对单一变量进行原子操作的类。原子变量类提供了在整数或者对象引用上的细粒度原子操作(因此可伸缩性更高),并使用了现代处理器中提供的底层并发原语(例如比较并交换[compare-and-swap])。所有的类都提供了get和set方法,可以使用它们像读写volatile变量一样读写原子类。就是说,同一变量上的一个set操作对于任意后续的get操作存在happens-before关系。原子的compareAndSet方法也有内存一致性特点,就像应用到整型原子变量中的简单原子算法。
为了看看这个包如何使用,让我们返回到最初用于演示线程干扰的Counter类:
public class Counter {
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
使用同步是一种使Counter类变得线程安全的方法,如SynchronizedCounter:
public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
对于这个简单的类,同步是一种可接受的解决方案。但是对于更复杂的类,我们可能想要避免不必要同步所带来的活跃度影响。将int替换为AtomicInteger允许我们在不进行同步的情况下阻止线程干扰,如AtomicCounter:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
public void decrement() {
c.decrementAndGet();
}
public int value() {
return c.get();
}
}
并发集合
ConcurrentHashMap
使用的是一种更细粒度的锁,这种机制称为分段锁(Lock Striping)。在这种机制中,任意数量的读取线程可以并发的访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map。
迭代的时候不会抛出ConcurrentModificationException,迭代器是拥有"弱一致性",而非"即时失败。size返回的是一个估计值。
ConcurrentNavigableMap是ConcurrentMap的子接口,支持近似匹配。ConcurrentNavigableMap的标准实现是ConcurrentSkipListMap,它是TreeMap的并发模式。ConcurrentSkipListMap和ConcurrentSkipListSet分别作为同步的SortedMap和SortedSet的并发替代品。
import java.util.Map;
public interface ConcurrentMap<K, V> extends Map<K, V> {
/**
* 仅当K没有相应的映射值才插入
* @param key
* @param value
* @return
*/
V putIfAbsent(K key, V value);
/**
* 仅当K被映射到V时才移除
* @param key
* @param value
* @return
*/
boolean remove(Object key, Object value);
/**
* 仅当 K被映射到oldValue时才替换为newValue
* @param key
* @param oldValue
* @param newValue
* @return
*/
boolean replace(K key, V oldValue, V newValue);
/**
* 仅当K被映射到某个值时才替换为newValue
* @param key
* @param value
* @return
*/
V replace(K key, V value);
}
CopyOnWriteArrayList
在每次修改时,都会创建并重新发布一个新的容器副本,从而实现复制。“写入时复制”返回迭代器不会抛出ConcurrentModificationException,并且返回的元素与迭代器创建时的元素完全一致,而不必考虑之后修改操作所带来的影响。
并发随机数
在JDK7中,java.util.concurrent包含了一个相当便利的类,ThreadLocalRandom,当应用程序期望在多个线程或ForkJoinTasks中使用随机数时。 对于并发访问,使用TheadLocalRandom代替Math.random()可以减少竞争,从而获得更好的性能。 你只需调用ThreadLocalRandom.current(), 然后调用它的其中一个方法去获取一个随机数即可。下面是一个例子:
int r = ThreadLocalRandom.current().nextInt(4,77);
分享到:
相关推荐
四、原子变量 Atomic类,如AtomicInteger、AtomicLong和AtomicReference,提供了在不使用锁的情况下实现原子更新的能力。这些类提供了原子操作,如incrementAndGet(),decrementAndGet(),compareAndSet()等,用于在...
二、随机数与随机变量的产生 在计算机模拟中,随机数是必不可少的元素,它们用于模拟现实世界中的不确定性。随机数生成器是专门的算法,可以产生看起来无规律的数字序列。随机变量则是这些数字在特定概率分布下的...
Java并发工具类是Java平台提供的一系列用于处理多线程并发问题的类和接口,它们在`java.util.concurrent`包中。并发问题主要包括资源竞争、死锁、活锁以及饥饿等,合理使用并发工具可以有效地提高程序的并发性能并...
在Java编程中,生成随机数是一项常见的任务,用于模拟、测试和各种算法中。本文将深入探讨Java中生成随机数的几种方法及其特点。 首先,最基本的随机数生成方法是使用`java.lang.Math.random()`。这个静态方法返回...
在Java编程语言中,生成随机数是常见的需求,可以用于模拟、测试、加密等多种场景。本文将详细探讨Java中生成随机数的两种主要方法:`java.lang.Math.random()`静态方法和`java.util.Random`类。 首先,我们来看`...
4. **原子变量**:`AtomicInteger`、`AtomicLong`等原子变量类提供了原子操作,能够在无锁的情况下更新值,这对于构建高效的并发程序非常有用。 5. **锁和同步工具**:`ReentrantLock`、`Semaphore`、`...
6. **原子变量类**:Java的`java.util.concurrent.atomic`包提供了各种原子变量类,如AtomicInteger、AtomicLong等,它们支持原子性的读/更新操作,避免了显式的同步块或锁。 7. **线程局部变量**:`ThreadLocal`类...
用于在并发环境下生成随机数,系统默认的多线程情况生成的随机数是相同的
在Java编程语言中,随机数的生成是许多算法和应用的核心部分,比如模拟、游戏、加密等。Java提供了三种不同的随机数生成器类,每种都有其特定的用途和性能特性。 首先,`java.util.Random`是Java 1.0就引入的基础...
对于更高级的并发环境,Java 7引入了一个新的并发随机数生成器:java.util.concurrent.ThreadLocalRandom。这个类在内部使用了线程局部变量来避免多线程之间的竞争,相比于使用Random类,它在生成大量随机数时可以...
Java使用多线程找出最大随机数 Java使用多线程找出最大随机数是指使用Java语言中的多线程编程来找出在一定范围内生成的随机数中的最大值。该方法可以通过创建多个线程,每个线程都生成一定范围内的随机数,然后通过...
标题中的“利用系统时间可预测破解java随机数”揭示了一个重要的信息安全问题,即Java的随机数生成器在某些情况下可能不那么随机,可以被有心人利用系统时间预测。这通常发生在程序依赖于系统时间来生成随机数序列时...
// 使用 SecureRandom 类生成安全的随机数 try { java.security.SecureRandom secureRandom = new java.security.SecureRandom(); byte[] secureBytes = new byte[5]; secureRandom.nextBytes(secureBytes); System...
### Java随机数生成详解 #### 引言 在软件开发领域,随机数生成是一项非常基础且重要的功能。尤其是在游戏开发、密码学、统计模拟等领域,随机数的应用无处不在。Java作为一门广泛应用的编程语言,提供了多种生成...
### 在Java中产生随机数的两种方法 在Java编程中,生成随机数是常见的需求之一。根据提供的文件信息,本文将详细介绍两种在Java中生成随机数的方法:通过`Math.random()`函数与`java.util.Random`类。这两种方法各...
Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...
在高并发或者大规模数据处理的场景下,随机数生成器的效率直接影响系统的整体性能。"rnd-20190527"提供的性能测试可能包括了生成速度的测试,以及在不同负载下的系统资源占用情况。 POS机相关测试主要是针对金融...
Java Web 在高并发和分布式下实现订单号生成唯一的解决方案 在高并发和分布式下,实现订单号生成唯一是 Java Web 开发中的一大挑战。为了解决这个问题,我们需要从多方面考虑,包括时间戳、随机数、线程ID、进程ID...