以下内容摘自 http://www.ibm.com/developerworks/java/library/j-jtp04186/index.html?S_TACT=105AGX02&S_CMP=EDU
1. 使用CAS的非阻塞计数器
public class NonblockingCounter {
private AtomicInteger value;
public int getValue() {
return value.get();
}
public int increment() {
int v;
do {
v = value.get();
}
while (!value.compareAndSet(v, v + 1));
return v + 1;
}
}
2. 使用Treiber算法的非阻塞栈
public class ConcurrentStack<E> {
AtomicReference<Node<E>> head = new AtomicReference<Node<E>>();
public void push(E item) {
Node<E> newHead = new Node<E>(item);
Node<E> oldHead;
do {
oldHead = head.get();
newHead.next = oldHead;
} while (!head.compareAndSet(oldHead, newHead));
}
public E pop() {
Node<E> oldHead;
Node<E> newHead;
do {
oldHead = head.get();
if (oldHead == null)
return null;
newHead = oldHead.next;
} while (!head.compareAndSet(oldHead,newHead));
return oldHead.item;
}
static class Node<E> {
final E item;
Node<E> next;
public Node(E item) { this.item = item; }
}
}
3. Michael-Scott的非阻塞队列算法
public class LinkedQueue <E> {
private static class Node <E> {
final E item;
final AtomicReference<Node<E>> next;
Node(E item, Node<E> next) {
this.item = item;
this.next = new AtomicReference<Node<E>>(next);
}
}
private AtomicReference<Node<E>> head
= new AtomicReference<Node<E>>(new Node<E>(null, null));
private AtomicReference<Node<E>> tail = head;
public boolean put(E item) {
Node<E> newNode = new Node<E>(item, null);
while (true) {
Node<E> curTail = tail.get();
Node<E> residue = curTail.next.get();
if (curTail == tail.get()) {
if (residue == null) /* A */ {
if (curTail.next.compareAndSet(null, newNode)) /* C */ {
tail.compareAndSet(curTail, newNode) /* D */ ;
return true;
}
} else {
tail.compareAndSet(curTail, residue) /* B */;
}
}
}
}
}
分享到:
相关推荐
非阻塞算法是一种在多线程环境中用于处理并发问题的高级技术,其核心特性在于它能够在不使用传统锁机制的情况下保证数据的一致性和完整性。Java 5.0 引入了 java.util.concurrent 包,使得在Java中实现非阻塞算法...
非阻塞算法是一种在多线程编程中用于访问共享资源的策略,与传统的阻塞算法相比,它不依赖于锁或者其他同步机制来确保数据的一致性。非阻塞算法的核心思想是让线程在无法立即完成操作时,不进入等待状态,而是尝试...
非阻塞算法是一种在多线程环境中用于处理并发问题的技术,它避免了使用传统的锁定机制,如Java中的`synchronized`关键字。在Java 5.0及以上版本,通过引入`java.util.concurrent`包,非阻塞算法得以实现,这主要归功...
非阻塞算法避免了线程在等待锁释放时的阻塞状态,通过原子操作和数据结构的设计实现并发访问,从而提高系统并行度和整体性能。这种算法在高并发场景下尤其重要,因为它可以减少线程间的同步开销,提升系统的吞吐量。...
2. **非阻塞算法**:确保即使在某些线程执行缓慢或被延迟的情况下,其他线程也能继续完成其操作。这类算法提供了更好的响应性和鲁棒性。 3. **阻塞算法**:允许慢速或延迟的线程阻止其他线程完成操作。在某些情况下...
原子操作类和非阻塞算法是其中的两个核心概念,它们提供了高效、线程安全的解决方案,尤其在高并发场景下表现优越。 首先,原子操作类是Java并发编程的重要工具,它们提供了一种无需锁机制即可保证操作原子性的方法...
非阻塞算法在Java语言中的实现是一个复杂而深入的话题,涉及到并发编程、多线程以及高效数据结构的设计。非阻塞算法,也称为无锁算法,主要特点是避免了线程间的互斥,使得多个线程可以同时进行计算,从而提高了系统...
### 基于多核处理器的有锁编程与非阻塞算法研究 #### 研究背景及意义 随着计算机技术的发展,特别是多核处理器的普及,如何有效地利用多核平台进行并行计算成为了研究的重点之一。传统的锁机制在单核环境中能够很...
非阻塞算法在Java编程中扮演着至关重要的角色,特别是在高并发、低延迟的应用场景下。这些算法的设计理念是让程序在等待资源可用时,而不是简单地挂起线程,而是继续执行其他任务,从而提高系统效率。Java通过提供...
BitTorrent中的“阻塞”是指节点拒绝向其他节点传输数据,而“非阻塞”则表示允许数据传输。系统通过调整阻塞状态来控制上传资源的分配。Tit-for-tat(TFT)阻塞算法是BitTorrent的基础,它选择当前上传速度最快的几...
### Java并发编程实践:原子变量与非阻塞算法 #### 锁的劣势 在Java并发编程中,锁作为控制线程访问共享资源的一种手段,确保了数据的一致性和线程安全。然而,锁的使用并非没有代价。当多个线程试图获取同一把锁...
### 阻塞通信与非阻塞通信:深入解析与应用 #### 1. 概述 在并行计算领域,尤其是使用MPI(Message Passing...通过掌握MPI中的非阻塞通信接口,开发者能够更好地设计和实现高性能的并行算法,充分挖掘并行计算的潜力。
总结起来,Disruptor的高性能主要得益于其独特的数据结构——环形缓冲区,以及精心设计的并发控制机制,包括序列号、多生产者-单消费者模型以及非阻塞算法。这些创新使得Disruptor在保证数据一致性的同时,极大地...
非阻塞算法不同于传统的基于锁的同步机制,它们允许线程在不阻塞其他线程的情况下进行操作,提高了系统的并发性和性能。 1. 非阻塞算法 非阻塞算法的核心在于利用底层硬件提供的原子操作,如比较并交换(CAS),来...
这篇文章会详细探讨如何使用Python实现socket非阻塞通信,并结合示例分析其原理、多线程以及客户端和服务器端的具体实现技巧。 首先,了解socket编程的基础概念至关重要。Socket是计算机网络数据传输的基本操作单元...
JAVA 中的 CAS 操作主要应用于 java.util.concurrent 包中,用于实现非阻塞算法,即非阻塞的线程安全机制。该包中的大多数类都使用 CAS 操作来实现同步机制,例如 AtomicInteger、AtomicLong 等原子变量类。 CAS ...
如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的...
如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的...
如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的...