锘??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕在线一区,91精品国产综合久久久久久久久久 ,日本一区二区三区精品视频http://www.aygfsteel.com/yuyee/category/46790.htmlzh-cnTue, 09 Nov 2010 21:33:46 GMTTue, 09 Nov 2010 21:33:46 GMT60AbstractQueuedSynchronizer鐪嬬湅http://www.aygfsteel.com/yuyee/archive/2010/11/09/337625.html緹旂緤緹旂緤Tue, 09 Nov 2010 07:30:00 GMThttp://www.aygfsteel.com/yuyee/archive/2010/11/09/337625.html
API涓殑瑙i噴錛氫負瀹炵幇渚濊禆浜庡厛榪涘厛鍑?(FIFO) 絳夊緟闃熷垪鐨勯樆濉為攣瀹氬拰鐩稿叧鍚屾鍣紙淇″彿閲忋佷簨浠訛紝絳夌瓑錛夋彁渚涗竴涓鏋躲傛綾葷殑璁捐鐩爣鏄垚涓轟緷闈犲崟涓師瀛?int 鍊兼潵琛ㄧず鐘舵佺殑澶у鏁板悓姝ュ櫒鐨勪竴涓湁鐢ㄥ熀紜銆傚瓙綾誨繀欏誨畾涔夋洿鏀規鐘舵佺殑鍙椾繚鎶ゆ柟娉曪紝騫跺畾涔夊摢縐嶇姸鎬佸浜庢瀵硅薄鎰忓懗鐫琚幏鍙栨垨琚噴鏀俱傚亣瀹氳繖浜涙潯浠朵箣鍚庯紝姝ょ被涓殑鍏朵粬鏂規硶灝卞彲浠ュ疄鐜版墍鏈夋帓闃熷拰闃誨鏈哄埗銆傚瓙綾誨彲浠ョ淮鎶ゅ叾浠栫姸鎬佸瓧孌碉紝浣嗗彧鏄負浜嗚幏寰楀悓姝ヨ屽彧榪借釜浣跨敤 getState()銆?a href="="">getState()銆?a href="=" "="">getState()銆?a href="">setState(int) 鍜?compareAndSetState(int, int) 鏂規硶鏉ユ搷浣滀互鍘熷瓙鏂瑰紡鏇存柊鐨?int 鍊箋?/div>
姝ょ被閲囩敤妯℃澘妯″紡璁捐錛屾綾諱負涓涓娊璞$被錛屼絾鏄病鎶借薄鏂規硶錛屾瘡涓猻ync瀛愮被闇瑕佸疄鐜?涓彈淇濇姢鐨勬柟娉?/div>

榪欎釜5涓柟娉曞湪AbstractQueuedSynchronizer 閮芥姏鍑簍hrow new UnsupportedOperationException();
AbstractQueuedSynchronizer 涓湁3涓睘鎬э細涓昏澹版槑涓涓姸鎬佸拰涓涓獁ait queue,閫氳繃

wait queue涓璑ode 涓轟竴涓弻鍚戦摼琛紝闇瑕佸幓鐞嗚ВNode涓嚑涓潤鎬佸瓧孌靛肩殑鎰忎箟錛屼笅闈負浠栫殑婧愮爜錛?/div>
static final class Node {
        /** waitStatus value to indicate thread has cancelled */
        static final int CANCELLED =  1;
        /** waitStatus value to indicate successor's thread needs unparking */
        static final int SIGNAL    = -1;
        /** waitStatus value to indicate thread is waiting on condition */
        static final int CONDITION = -2;
        /** Marker to indicate a node is waiting in shared mode */
        static final Node SHARED = new Node();
        /** Marker to indicate a node is waiting in exclusive mode */
        static final Node EXCLUSIVE = null;

        /**
         * Status field, taking on only the values:
         *   SIGNAL:     The successor of this node is (or will soon be)
         *               blocked (via park), so the current node must
         *               unpark its successor when it releases or
         *               cancels. To avoid races, acquire methods must
         *               first indicate they need a signal,
         *               then retry the atomic acquire, and then,
         *               on failure, block.
         *   CANCELLED:  This node is cancelled due to timeout or interrupt.
         *               Nodes never leave this state. In particular,
         *               a thread with cancelled node never again blocks.
         *   CONDITION:  This node is currently on a condition queue.
         *               It will not be used as a sync queue node until
         *               transferred. (Use of this value here
         *               has nothing to do with the other uses
         *               of the field, but simplifies mechanics.)
         *   0:          None of the above
         *
         * The values are arranged numerically to simplify use.
         * Non-negative values mean that a node doesn't need to
         * signal. So, most code doesn't need to check for particular
         * values, just for sign.
         *
         * The field is initialized to 0 for normal sync nodes, and
         * CONDITION for condition nodes.  It is modified only using
         * CAS.
         */
        volatile int waitStatus;

        /**
         * Link to predecessor node that current node/thread relies on
         * for checking waitStatus. Assigned during enqueing, and nulled
         * out (for sake of GC) only upon dequeuing.  Also, upon
         * cancellation of a predecessor, we short-circuit while
         * finding a non-cancelled one, which will always exist
         * because the head node is never cancelled: A node becomes
         * head only as a result of successful acquire. A
         * cancelled thread never succeeds in acquiring, and a thread only
         * cancels itself, not any other node.
         */
        volatile Node prev;

        /**
         * Link to the successor node that the current node/thread
         * unparks upon release. Assigned once during enqueuing, and
         * nulled out (for sake of GC) when no longer needed.  Upon
         * cancellation, we cannot adjust this field, but can notice
         * status and bypass the node if cancelled.  The enq operation
         * does not assign next field of a predecessor until after
         * attachment, so seeing a null next field does not
         * necessarily mean that node is at end of queue. However, if
         * a next field appears to be null, we can scan prev's from
         * the tail to double-check.
         */
        volatile Node next;

        /**
         * The thread that enqueued this node.  Initialized on
         * construction and nulled out after use.
         */
        volatile Thread thread;

        /**
         * Link to next node waiting on condition, or the special
         * value SHARED.  Because condition queues are accessed only
         * when holding in exclusive mode, we just need a simple
         * linked queue to hold nodes while they are waiting on
         * conditions. They are then transferred to the queue to
         * re-acquire. And because conditions can only be exclusive,
         * we save a field by using special value to indicate shared
         * mode.
         */
        Node nextWaiter;

        /**
         * Returns true if node is waiting in shared mode
         */
        final boolean isShared() {
            return nextWaiter == SHARED;
        }

        /**
         * Returns previous node, or throws NullPointerException if
         * null.  Use when predecessor cannot be null.
         * @return the predecessor of this node
         */
        final Node predecessor() throws NullPointerException {
            Node p = prev;
            if (p == null)
                throw new NullPointerException();
            else
                return p;
        }

        Node() {    // Used to establish initial head or SHARED marker
        }

        Node(Thread thread, Node mode) {     // Used by addWaiter
            this.nextWaiter = mode;
            this.thread = thread;
        }

        Node(Thread thread, int waitStatus) { // Used by Condition
            this.waitStatus = waitStatus;
            this.thread = thread;
        }


    }
鑾峰彇閿佸畾璋冪敤鐨勬柟娉曪紝鍏跺疄榪欎釜鏂規硶鏄樆濉炵殑錛?/div>
  public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }
濡傛灉鑾峰彇涓嶆垚鍔熷垯璋冪敤濡備笅鏂規硶錛?
   final boolean acquireQueued(final Node node, int arg) {
        try {
            boolean interrupted = false;
            for (;;) {
                final Node p = node.predecessor();
                if (p == head && tryAcquire(arg)) {//褰撹妭鐐規槸澶磋妭鐐逛笖鐙崰鏃舵墠榪斿洖
                    setHead(node);
                    p.next = null; // help GC
                    return interrupted;
                }
                if (shouldParkAfterFailedAcquire(p, node) &&
                    parkAndCheckInterrupt())//闃誨騫跺垽鏂槸鍚︽墦鏂紝鍏跺疄榪欎釜鍒ゆ柇鎵嶆槸鑷棆閿佺湡姝g殑鐚ョ悙鐐癸紝
鎰忔濇槸濡傛灉浣犵殑鍓嶇戶鑺傜偣涓嶆槸head,鑰屼笖褰撲綘鐨勫墠緇ц妭鐐圭姸鎬佹槸Node.SIGNAL鏃訛紝浣犺繖涓嚎紼嬪皢琚玴ark()錛岀洿鍒板彟澶栫殑綰跨▼release鏃?鍙戠幇head.next鏄綘榪欎釜node鏃訛紝鎵島npark錛屼綘鎵嶈兘緇х畫寰幆騫惰幏鍙栭攣
                    interrupted = true;
            }
shouldParkAfterFailedAcquire榪欎釜鏂規硶鍒犻櫎鎵鏈墂aitStatus>0涔熷氨鏄疌ANCELLED鐘舵佺殑Node,騫惰緗墠緇ц妭鐐逛負signal
 private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
        int s = pred.waitStatus;
        if (s < 0)
            /*
             * This node has already set status asking a release
             * to signal it, so it can safely park
             */
            return true;
        if (s > 0) {
            /*
             * Predecessor was cancelled. Skip over predecessors and
             * indicate retry.
             */
   do {
node.prev = pred = pred.prev;
   } while (pred.waitStatus > 0);
   pred.next = node;
}
        else
            /*
             * Indicate that we need a signal, but don't park yet. Caller
             * will need to retry to make sure it cannot acquire before
             * parking.
             */
            compareAndSetWaitStatus(pred, 0, Node.SIGNAL);
        return false;
    }


浣跨敤LockSupport.park(this)錛岀鐢ㄥ綋鍓嶇嚎紼?/div>
private final boolean parkAndCheckInterrupt() {
        LockSupport.park(this);//block
        return Thread.interrupted();
    }
閲婃斁閿侊細
    public final boolean release(int arg) {
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);//unblock
            return true;
        }
        return false;
    }
private void unparkSuccessor(Node node) {
        /*
         * Try to clear status in anticipation of signalling.  It is
         * OK if this fails or if status is changed by waiting thread.
         */
        compareAndSetWaitStatus(node, Node.SIGNAL, 0);

        /*
         * Thread to unpark is held in successor, which is normally
         * just the next node.  But if cancelled or apparently null,
         * traverse backwards from tail to find the actual
         * non-cancelled successor.
         */
        Node s = node.next;
        if (s == null || s.waitStatus > 0) {
            s = null;
            for (Node t = tail; t != null && t != node; t = t.prev)
                if (t.waitStatus <= 0)
                    s = t;
        }
        if (s != null)
            LockSupport.unpark(s.thread);
    }


        } catch (RuntimeException ex) {
            cancelAcquire(node);
            throw ex;
        }
    }
  

鐪嬩笅ReentrantLock閿佷腑sync鐨勫疄鐜幫細
 static abstract class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = -5179523762034025860L;

        /**
         * Performs {@link Lock#lock}. The main reason for subclassing
         * is to allow fast path for nonfair version.
         */
        abstract void lock();

        /**
         * Performs non-fair tryLock.  tryAcquire is
         * implemented in subclasses, but both need nonfair
         * try for trylock method.
         */
        final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

        protected final boolean tryRelease(int releases) {
            int c = getState() - releases;
            if (Thread.currentThread() != getExclusiveOwnerThread())
                throw new IllegalMonitorStateException();
            boolean free = false;
            if (c == 0) {
                free = true;
                setExclusiveOwnerThread(null);
            }
            setState(c);
            return free;
        }

        protected final boolean isHeldExclusively() {
            // While we must in general read state before owner,
            // we don't need to do so to check if current thread is owner
            return getExclusiveOwnerThread() == Thread.currentThread();
        }

        final ConditionObject newCondition() {
            return new ConditionObject();
        }

        // Methods relayed from outer class

        final Thread getOwner() {
            return getState() == 0 ? null : getExclusiveOwnerThread();
        }

        final int getHoldCount() {
            return isHeldExclusively() ? getState() : 0;
        }

        final boolean isLocked() {
            return getState() != 0;
        }

        /**
         * Reconstitutes this lock instance from a stream.
         * @param s the stream
         */
        private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {
            s.defaultReadObject();
            setState(0); // reset to unlocked state
        }
    }
闈炲叕騫寵鍒欎笅nonfairTryAcquire錛岃幏鍙栧綋鍓嶉攣鐨剆tate,閫氳繃CAS鍘熷瓙鎿嶄綔璁劇疆涓?錛屽茍灝嗗綋鍓嶇嚎紼嬭緗負鐙崰綰跨▼錛屽鏋滃綋鍓嶇嚎紼嬪凡緇忔嬁浜嗛攣錛屽垯state澧炲姞1
鍏鉤閿佷腑 鏈夊涓嬪垽鏂細
if (isFirst(current) &&//鍒ゆ柇澶村厓绱?/div>
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
鍦ㄨ幏鍙栭攣姝ラ錛?/div>
1.璋冪敤tryAcquire鏉ヨ幏鍙栵紝濡傛灉澶辮觸錛屽垯榪涘叆2
2.璋冪敤addWaiter錛屼互鐙崰妯″紡灝唍ode鏀懼埌tail浣嶇疆
3.璋冪敤acquireQueued鏂規硶錛屾鏂規硶闃誨錛岀洿鍒皀ode鐨刾re涓篽ead,騫舵垚鍔熻幏鍙栭攣瀹氾紝涔熷彲鑳藉瓨鍦ㄩ樆濉炲茍鎵撴柇鎯呭喌
閲婃斁閿佺殑姝ラ錛?/div>
1.鏀懼純鎺掍粬閿佹寔鏈夋潈
2.unpark 鑺傜偣鐨勪笅涓涓猙locked鑺傜偣

鍏鉤閿佷笌闈炲叕騫抽攣錛氫粠浠g爜涓婄湅錛岄潪鍏鉤閿佹槸璁╁綋鍓嶇嚎紼嬩紭鍏堢嫭鍗狅紝鑰屽叕騫抽攣鍒欐槸璁╃瓑寰呮椂闂存渶闀跨殑綰跨▼浼樺厛錛岄潪鍏鉤鐨勫彲鑳借鍏朵粬綰跨▼娌℃満浼氭墽琛岋紝鑰屽叕騫崇殑鍒欏彲浠ヨ絳夊緟鏃墮棿鏈闀跨殑鍏堟墽琛岋紝浣嗘槸鎬ц兘涓婁細宸偣


緹旂緤 2010-11-09 15:30 鍙戣〃璇勮
]]>鍚屾鍖呬腑鐨勫畾鏃跺櫒http://www.aygfsteel.com/yuyee/archive/2010/11/01/336694.html緹旂緤緹旂緤Mon, 01 Nov 2010 07:48:00 GMThttp://www.aygfsteel.com/yuyee/archive/2010/11/01/336694.html
ScheduledExecutorService 鍒╃敤綰跨▼姹犺繘琛岃皟搴︿換鍔★紝鍐呴儴浣跨敤涓涓狣elayedWorkQueue瀹炵幇錛岃繑鍥濻cheduledFuture錛岃孌elayQueue鏄敤浼樺厛綰ч槦鍒桺riorityQueue瀹炵幇鐨勪竴涓樆濉為槦鍒楋紝浼樺厛闃熷垪鐨勬瘮杈冨熀鍑嗗兼槸鏃墮棿
  private static class DelayedWorkQueue 
        extends AbstractCollection<Runnable> 
        implements BlockingQueue<Runnable> {
        
        private final DelayQueue<ScheduledFutureTask> dq = new DelayQueue<ScheduledFutureTask>();
}

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
    implements BlockingQueue<E> {

    private transient final ReentrantLock lock = new ReentrantLock();
    private transient final Condition available = lock.newCondition();
    private final PriorityQueue<E> q = new PriorityQueue<E>();

涓嬮潰涓轟竴涓皬渚?
public class ConcurrentTimer {
public static void main(String[] args) {
new ConcurrentTimer().getScheduledExecutorService();
}

public void getScheduledExecutorService() {
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
service.scheduleAtFixedRate(new Command(), 1, 1, TimeUnit.SECONDS);
}

public class Command implements Runnable {

public void run() {
System.out.println("Command");
}

}
}


緹旂緤 2010-11-01 15:48 鍙戣〃璇勮
]]>volatilehttp://www.aygfsteel.com/yuyee/archive/2010/11/01/336669.html緹旂緤緹旂緤Mon, 01 Nov 2010 06:04:00 GMThttp://www.aygfsteel.com/yuyee/archive/2010/11/01/336669.html浣跨敤volatile瑕佹敞鎰忥紝浠栧彧鑳戒繚璇佸彲瑙佹э紝浣嗕笉鑳戒繚璇佸師瀛愭э紱
濡俰++涔嬬被鐨勬搷浣滐紝浠栧垎涓簉ead i鐨勫鹼紝涔嬪悗鎵цi+1
褰撳嚭鐜板茍鍙戞儏鍐墊椂錛?綰跨▼read i鐨勫鹼紝鑰?綰跨▼淇敼浜唅鐨勫鹼紝榪欎釜鏃跺?綰跨▼濡傛灉鍐嶅皢鍊煎埛鍒頒富瀛樼殑璇濆氨浼氶犳垚瑕嗙洊銆?/div>
鍙互閫氳繃synchronized鍦ㄥ悓姝ヤ唬鐮佹錛屼繚璇佸師瀛愭?/div>
鎴栬呬嬌鐢╦dk1.5鐨勫師瀛愬寘



緹旂緤 2010-11-01 14:04 鍙戣〃璇勮
]]>鐢熶駭鑰呮秷璐硅?/title><link>http://www.aygfsteel.com/yuyee/archive/2010/11/01/336643.html</link><dc:creator>緹旂緤</dc:creator><author>緹旂緤</author><pubDate>Sun, 31 Oct 2010 16:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/yuyee/archive/2010/11/01/336643.html</guid><description><![CDATA[<div>package com.google.study.MQ;</div> <div><br /> </div> <div>import java.util.LinkedList;</div> <div>import java.util.List;</div> <div>import java.util.concurrent.locks.Condition;</div> <div>import java.util.concurrent.locks.ReentrantLock;</div> <div><br /> </div> <div>public class MessageQueue {</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private List<Message> messageList = new LinkedList<Message>();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private final ReentrantLock lock = new ReentrantLock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Condition notFull = lock.newCondition();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Condition notEmpty = lock.newCondition();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Integer maxNum = 5;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Integer minNum = 0;</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public int size() {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>return messageList.size();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void produce(Message e) throws InterruptedException {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>try {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>lock.lock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>while (messageList.size() == maxNum) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>notFull.await();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>messageList.add(e);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>notEmpty.signal();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} finally {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>lock.unlock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void consume() {</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>try {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>lock.lock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>while (messageList.size() == minNum) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>notEmpty.await();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>messageList.get(0);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>messageList.remove(0);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>notFull.signal();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} catch (Exception e) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>e.printStackTrace();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} finally {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>lock.unlock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div>}</div> <div> <div>package com.google.study.MQ;</div> <div><br /> </div> <div>public class Consume implements Runnable {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private MessageQueue queue;</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public Consume(MessageQueue queue) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>this.queue = queue;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>@Override</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void run() {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>while (true) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>queue.consume();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>System.out.println(queue.size());</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>try {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread.sleep(50);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} catch (InterruptedException e) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>// TODO Auto-generated catch block</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>e.printStackTrace();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div>}</div> </div> <div><br /> </div> <div> <div>package com.google.study.MQ;</div> <div><br /> </div> <div>public class Produce implements Runnable {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private MessageQueue queue;</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public Produce(MessageQueue queue) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>this.queue = queue;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>@Override</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void run() {</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>while (true) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>try {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>queue.produce(getMessage());</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread.sleep(100);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} catch (InterruptedException e) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>// TODO Auto-generated catch block</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>e.printStackTrace();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Message getMessage() {</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Message m = new Message();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>m.setName("1");</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>m.setValue(1);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>return m;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div>}</div> </div> <div> <div>package com.google.study.MQ;</div> <div><br /> </div> <div>import java.io.Serializable;</div> <div><br /> </div> <div>public class Message implements Serializable {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private int value;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private String name;</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public int getValue() {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>return value;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void setValue(int value) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>this.value = value;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public String getName() {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>return name;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div> <div>package com.google.study.MQ;</div> <div><br /> </div> <div>public class Test {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public static void main(String[] args) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>MessageQueue queue = new MessageQueue();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread p1 = new Thread(new Produce(queue));</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread p2 = new Thread(new Produce(queue));</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread p3 = new Thread(new Produce(queue));</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread p4 = new Thread(new Produce(queue));</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread c1 = new Thread(new Consume(queue));</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Thread c2 = new Thread(new Consume(queue));</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>p1.start();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>p2.start();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>p3.start();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>p4.start();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>c1.start();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>c2.start();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span></div> <div>}</div> </div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void setName(String name) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>this.name = name;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div>}</div> </div> <div><br /> </div> <img src ="http://www.aygfsteel.com/yuyee/aggbug/336643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yuyee/" target="_blank">緹旂緤</a> 2010-11-01 00:47 <a href="http://www.aygfsteel.com/yuyee/archive/2010/11/01/336643.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ReentrantReadWriteLock璇誨啓閿?/title><link>http://www.aygfsteel.com/yuyee/archive/2010/10/31/336640.html</link><dc:creator>緹旂緤</dc:creator><author>緹旂緤</author><pubDate>Sun, 31 Oct 2010 15:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/yuyee/archive/2010/10/31/336640.html</guid><description><![CDATA[public class <strong>ReentrantReadWriteLock </strong>extends <a title="java.lang 涓殑綾? href="">Object</a> implements <a title="="">Object</a> implements <a title="java.util.concurrent.locks 涓殑鎺ュ彛" href="">ReadWriteLock</a>, <a title="java.io 涓殑鎺ュ彛" href="">Serializable</a> <div>1.鍙噸鍏ワ紝鍙噸鍏ョ殑鎰忔濆綋鍓嶇嚎紼嬪凡鑾瘋閿侊紝榪樺彲浠ュ啀鑾峰彇錛屼絾鏄鍐欓攣閲岋紝WriteLock鍙互鑾峰彇ReadLock,浣嗘槸ReadLock涓嶈兘鑾峰彇WriteLock</div> <div>2.WriteLock鍙互闄嶇駭涓篟eadLock,鎰忔濇槸錛氬厛鑾峰彇WriteLock,鍦ㄨ幏鍙朢eadLock,閲婃斁WriteLock,榪欐椂鍊欑嚎紼嬪氨灝唊eep ReadLock,浣嗘槸濡傛灉ReadLock鎯寵鍗囩駭涓篧riteLock錛屽垯涓嶅彲鑳斤紝鍥犱負鏍規嵁璇誨啓閿佺殑鍙噸鍏ョ壒鎬э紝ReadLock鎺掓枼鎵鏈塛riteLock,涔熷氨鏄?1)鐗規?/div> <div>3.ReadLock鍙互琚涓嚎紼嬫寔鏈夊茍鍦ㄤ綔鐢ㄦ椂鎺掓枼浠諱綍WriteLock,鑰學riteLock闅旂鎬ф瘮ReadLock楂橈紝瀹冩槸瀹屽叏鐨勬帓鏂ワ紝鏍規嵁榪欎竴鐗規э紝璇誨啓閿侀傚悎楂橀鐜囪錛屼絾涓嶉傚悎楂橀鐜囧啓</div> <div>4.涓嶇鏄疪eadLock,WriteLock閮芥敮鎸両nterrupt</div> <div>5.WriteLock鏀寔Condition,浣嗘槸ReadLock涓嶆敮鎸丆ondition,灝嗘姏鍑?code>UnsupportedOperationException</code>銆?/div> <div>涓嬮潰鏄釜灝忎緥瀛愶細</div> <div><br /> </div> <div><br /> </div> <div> <div>package com.google.study;</div> <div><br /> </div> <div>import java.util.Map;</div> <div>import java.util.concurrent.ConcurrentHashMap;</div> <div>import java.util.concurrent.locks.ReentrantReadWriteLock;</div> <div>import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;</div> <div>import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;</div> <div><br /> </div> <div>public class ReentrantLockStudy {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Map<Integer, Result> map = new ConcurrentHashMap<Integer, Result>();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private final WriteLock writeLock = lock.writeLock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private final ReadLock readLock = lock.readLock();</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public Result get(Integer key) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>Result value = null;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>readLock.lock();// 鑾峰彇璇婚攣</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>try {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>value = map.get(key);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>if (value == null) {// 濡傛灉娌℃湁璇ョ粨鏋?/div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>readLock.unlock();// 蹇呴』閲婃斁璇婚攣</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>writeLock.lock();// 鑾峰彇鍐欓攣</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>value = map.get(key);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>if (value == null) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>value = getResult();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>map.put(key, value);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>readLock.lock();// 閲嶆柊闄嶇駭涓鴻閿?/div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>writeLock.unlock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} catch (Exception e) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>writeLock.unlock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>e.printStackTrace();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} finally {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>readLock.unlock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>return value;</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>public void put(Integer key, Result value) {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>writeLock.lock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>try {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>map.put(key, value);</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>} finally {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>writeLock.unlock();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private Result getResult() {</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>return new Result();</div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>private static class Result {</div> <div><br /> </div> <div><span id="wmqeeuq" class="Apple-tab-span" style="white-space:pre"> </span>}</div> <div>}</div> </div> <div><br /> </div> <img src ="http://www.aygfsteel.com/yuyee/aggbug/336640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yuyee/" target="_blank">緹旂緤</a> 2010-10-31 23:31 <a href="http://www.aygfsteel.com/yuyee/archive/2010/10/31/336640.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> 主站蜘蛛池模板: <a href="http://" target="_blank">敦煌市</a>| <a href="http://" target="_blank">来凤县</a>| <a href="http://" target="_blank">海原县</a>| <a href="http://" target="_blank">巴中市</a>| <a href="http://" target="_blank">兴仁县</a>| <a href="http://" target="_blank">湘西</a>| <a href="http://" target="_blank">寿宁县</a>| <a href="http://" target="_blank">鲁甸县</a>| <a href="http://" target="_blank">云林县</a>| <a href="http://" target="_blank">娄底市</a>| <a href="http://" target="_blank">六枝特区</a>| <a href="http://" target="_blank">商南县</a>| <a href="http://" target="_blank">刚察县</a>| <a href="http://" target="_blank">锡林浩特市</a>| <a href="http://" target="_blank">清水县</a>| <a href="http://" target="_blank">玛纳斯县</a>| <a href="http://" target="_blank">鄂伦春自治旗</a>| <a href="http://" target="_blank">宜良县</a>| <a href="http://" target="_blank">湘潭县</a>| <a href="http://" target="_blank">资阳市</a>| <a href="http://" target="_blank">团风县</a>| <a href="http://" target="_blank">灌阳县</a>| <a href="http://" target="_blank">安远县</a>| <a href="http://" target="_blank">巨鹿县</a>| <a href="http://" target="_blank">炉霍县</a>| <a href="http://" target="_blank">石渠县</a>| <a href="http://" target="_blank">临汾市</a>| <a href="http://" target="_blank">肇庆市</a>| <a href="http://" target="_blank">鄂尔多斯市</a>| <a href="http://" target="_blank">河东区</a>| <a href="http://" target="_blank">增城市</a>| <a href="http://" target="_blank">镇沅</a>| <a href="http://" target="_blank">东乡县</a>| <a href="http://" target="_blank">彝良县</a>| <a href="http://" target="_blank">漾濞</a>| <a href="http://" target="_blank">古田县</a>| <a href="http://" target="_blank">确山县</a>| <a href="http://" target="_blank">峨眉山市</a>| <a href="http://" target="_blank">辽宁省</a>| <a href="http://" target="_blank">绍兴县</a>| <a href="http://" target="_blank">涡阳县</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>