자바 이론 과 실천: 비 차단 알고리즘 소개
- , , 。Java synchronized ( ), , synchronized , synchronized 。 , , , , 。
-
- “ ” , , - - , 。 volatile , , 。
-
-
-
- 1 Counter , 。 , , : , 1, 。( getValue , getValue 。 , 。)
-
- , , 。JVM , 。 , 。
-
- 1.
- public final class Counter {
- private long value = 0;
- public synchronized long getValue() {
- return value;
- }
- public synchronized long increment() {
- return ++value;
- }
- }
-
- 2 NonblockingCounter : AtomicInteger compareAndSet() (CAS) 。compareAndSet() “ , , ”( “ ” “ ” 。)
-
- 2. 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;
- }
- }
-
- , , , 。 , 20 , Java 5.0 , Java 。
-
- , , , compareAndSet() 。( , AtomicInteger , compareAndSet(), NonblockingCounter.increment())。
-
- 。 , JVM , ( ) , , 。 , 。 CAS , 。
-
- NonblockingCounter , —— , CAS 。 , 。 , 。 , —— , 。 , , 。
-
-
-
-
-
- 3 ConcurrentStack。ConcurrentStack push() pop() NonblockingCounter , , “ ” , 。push() , , , , 。 CAS , , 。
-
- 3. 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; }
- }
- }
-
-
-
- , , CAS , , 。 CAS ( , CAS ), CAS 。
-
- ( ), , , , , 。 , , , , 。( , 。)“ ” , , , 。
-
-
-
-
-
- ( ) , CAS, 。 , , 、 。CAS , 。 , 、 , , CAS , 。
-
- , :“ ” ,“ ” 。 , CAS。 CAS : CAS , CAS , ? CAS , ?
-
- , “ ” ( ), , AWOL, 。 , “ ” , 。 , , , CAS ( , )。
-
- “ ” , , 。 , , , 。 , , , , ( )。
-
- 4 LinkedQueue Michael-Scott , ConcurrentLinkedQueue :
-
- 4. 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 */;
- }
- }
- }
- }
- }
-
- , 。 ; 。 1 :
-
- 1. ,
-
- 4 , , CAS : (C) , (D)。 , , , 。 , , 。 , “ ”, , 。
-
- : ( , 1 3) ( 2)。 CAS(D) , ; CAS(C) , 。 , next null, , null。 tail.next null, , “ ” 。
-
- 2. , ,
-
- (A) , , 4 。 , , (C) (D) 。 , “ ” , (B)。 , , , 。
-
- CAS(C) ; , , CAS 。 CAS(D) , —— (B) !
-
- 3. ,
-
-
-
- JVM , 。 ; , 。 Mustang(Java 6.0) , SynchronousQueue 。 SynchronousQueue, Executors.newCachedThreadPool() 。 , 3 。 Mustang ( Dolphin) , 。
-
-
-
-
-
- 。 , 。 Java , , Java , 。
-
-
-
-
- developerWorks 。
-
- “ ” (developerWorks,Brian Goetz,2004 11 ): Java 5.0 , - 。
-
- “Scalable Synchronous Queues”(ACM SIGPLAN ,William N. Scherer III、Doug Lea Michael L. Scott,2006 3 ): Java 6 SynchronousQueue 。
-
- “Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queues”(Maged M. Michael Michael L. Scott, ,1996): 4 。
-
- Java Concurrency in Practice (Addison-Wesley Professional,Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes Doug Lea,2006 6 ): Java how-to , , , 。
-
- Java : Java 。
-
-
- JDK 5.0 Update 6: JDK 5.0 。
-
-
- 。
-
- developerWorks blog: developerWorks 。
-
-
-
- Brian Goetz 18 。 Quiotix , , Los Altos, JCP 。Brian Java Concurrency In Practice 2006 Addison-Wesley 。 Brian 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.