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();
    }
}

Gson的JSON轉換成JAVA物件時,型別資訊遺失的解決方法

想要把JSON轉換成JAVA物件,或是把JAVA物件轉換成JSON怎麼做呢?

Gson 是個好用的JSON對JAVA的轉換工具,他可以將JSON轉換成JAVA物件,以及把JAVA物件轉換成JSON

例如:

JAVA:
class A
{
String a="NAME";
int id=500;
}

轉成JSON之後,就會變成

JSON:
{"a":"NAME","id":500}

詳細說明可以看Gson的官方網站
Gson的官方網站

但很遺憾的是,Gson有個缺點,那就是….
(繼續閱讀…)

F23.tw 縮網址網站正式上線!

終於把程式給寫完了

http://f23.tw/

因為看縮網址這項服務似乎蠻簡單的,就花點時間來寫了一下…. 果然不難,只不過因為想多加一些功能下去,才會花了三四個禮拜的時間才完成。

 

簡單的來介紹一些與其他縮網址不同的功能:

1.支援自訂義短網址:你可以為自己的短網址命名,例如說….
http://f23.tw/介紹
你可以選擇為短網址命名,而不是由程式自動產生流水字串,你也可以用中文或是日文等其他語言為短網址命名,不過這些非英文文字將被轉換URL邊碼

2.提供保留副檔名的功能
舉例來說,當你貼了一張圖之後,你可以讓網址看起來像是這樣
http://f23.tw/FFFF.jpg
當然,原本的 http://f23.tw/FFFF 也是可以使用的

3.提供詳細的流量統計,以及使用者追蹤
如範例頁面
http://f23.tw/介紹/u (網址後加 /u 為使用者追蹤)
http://f23.tw/介紹/i (網址後加 /i 為點擊統計)

(繼續閱讀…)

千萬別盜圖!

台中市市長胡志強倒馬、反核、反旺旺!?

今天看到在台中市市長胡志強競的網站上看到這張圖,差點沒笑翻 XDDDD

(現在圖還在,明天說不定就會被撤下來了。)

dah2

原本以為是被入侵,不過看一下就知道原因了。

(繼續閱讀…)

遞迴的基本結構以及注意事項

直接用個範例來說明:

這個Method純粹只是為了當範例用的
當傳進去的x不等於y的時候,他會把x+1,然後繼續遞迴下去
直到x==y為止

(繼續閱讀…)

程式語言快速上手

一直以來,一直想寫一些比較抽象的概念,聊聊「到底要怎麼學一個程式語言」這件事。

感覺上,程式這種東西,是一種邏輯概念。

常常看到有人問,我該不該學C++?我該不該學JAVA?我該不該學PHP?C++跟JAVA哪一種程式語言比較有用?比較好?

但其實,這些都是同一個的問題。
(繼續閱讀…)

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的環境差異,會讓表單的設計上很大的不同。
(繼續閱讀…)

PHP 伺服器500錯誤,看不到錯誤訊息,怎麼辦?

伺服器500錯誤時,在移機時很容易發生,通常的原因是檔案路徑(path)跑掉的關係,

但是,有些伺服器商、主機商、虛擬主機商提供的空間並沒有開啟錯誤訊息,於是,連上網業之後只看的到伺服器500錯誤,連log都沒得看,該怎麼辦呢?

還是有對應的方法的,下面這幾種技巧可以幫助除錯,抓到程式的問題出在哪裡。

(繼續閱讀…)

Java 儲存大量boolean資料時的解決方案:BitSet

java.util.BitSet

BitSet實際上是個boolean Vector,如果希望節省記錄0、1資訊的空間,或是大量使用boolean資料,節省記憶體儲存空間,就應該使用BitSet。

在讀取上,會比一般讀取boolean慢一點。

另外,BitSet最小的長度是一個Long,也就是64 位元。

BitSet 的 Java doc

 

開始學習JAVA Web開發

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

(繼續閱讀…)

«page 1 of 2
Welcome , today is 星期日, 2024/12/22