Java ArrayDeque die in Multiple threads

今天遇到一個問題

Java 的 ArrayDeque 並非執行序安全的物件,在多執行緒的狀況下,會卡死,導致使用poll時,任何東西都拿不出來。

解決方法很簡單單,上個synchronized去鎖住就行了。

因為我原本在使用這個東西的程式碼中,在別的地方有用lock去控制執行緒,再加上認為這邊應該只會造成順序亂掉之類的問題,就沒上synchronized,沒想到ArrayDeque會死到連東西都拿不出來。

package com.f23ko.test;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Map;

/**
 * Created by f23ko on 2016/10/5.
 *
 * sysout:
 * take(3) put(3) diff(0)
 * take(326) put(866) diff(540)
 * take(1746) put(1751) diff(5)
 * take(2629) put(2637) diff(8)
 * take(3515) put(3523) diff(8)
 * take(4400) put(4408) diff(8)
 * take(4718) put(5285) diff(567) <= ArrayDeque die
 * take(4718) put(6164) diff(1446)
 * take(4718) put(7047) diff(2329)
 */
public class QueueTest {
    static Deque<Integer> queue=new ArrayDeque<>();
    static int take=0;
    static int put=0;

    static void take()  {
        while (true){
            Integer t= queue.poll();
            if(t!=null){
                take++;
                continue;
            }

            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    static void put() {
        int i=0;
        while (true){
            i++;
            queue.offer(i);
            put++;
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    static void print(){
        while (true){
            int t=take;
            int p=put;
            System.out.println("take("+t+") put("+p+") diff("+(p-t)+")");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args){
        new Thread(QueueTest::put).start();
        new Thread(QueueTest::put).start();
        new Thread(QueueTest::put).start();
        new Thread(QueueTest::take).start();
        new Thread(QueueTest::print).start();
    }
}

JSP 與 PHP 的差異:用戶端HTML中的陣列命名

相信常寫網頁的人一定對下面幾行很熟了。

<form action="test.php" method="post">
    <input type="checkbox" name="cb1" value="CB11">CB01_1
    <HR>
    <input type="submit" value="送出">
</form>

以上語法,成現出來的效果就是這樣子(我改了一下底色,讓form比較明顯一點。)

CB01_1


這是一個普通的表單,但是,在JSP與PHP的環境差異,會讓表單的設計上很大的不同。
(繼續閱讀…)

開始學習JAVA Web開發

最近開始學寫java Web
感覺起來….. 跟php相比,JAVA端根本已經包辦全部的工作了呢。
以前學PHP時,常常需要去呼叫外部的執行程式、CGI或是模組等等
但是JAVA可以一次全部都通吃

(繼續閱讀…)

收到OCPJP證書了

今天收到OCPJP證照了

距離去考試的時間(12/21)過了三個禮拜,速度還蠻快的。

C#跟JAVA使用上的差異

Java當初的設計理念是簡單、安全
也因此可以很快上手,但也因此少掉很多在C++中好用以及麻煩的東西

以下是我從C#轉學JAVA的心得
(繼續閱讀…)

通過JAVA認證 OCPJP考試!

昨天去考了OCPJP的考試,以86%的答對率通過。感覺上,考的並不難,只是很細,有些東西如果不常用的話,還真的會記不住。

算一算,從開始學JAVA,到現在四個半月,好像也不算短。

以下,是準備OCPJP的心得,以及準備方向。

附帶一題,我完全沒去補習班上過JAVA的課,自學考OCPJP是可行的!

(繼續閱讀…)

page 1 of 1
Welcome , today is 星期二, 2024/03/19