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、ASP.NET、PHP比較

因為自己用過幾種程式語言
所以把用過的感想整理一下
分析各種語言的優缺點

有些人可能會感到困惑:我到底該學哪種語言?

我的回答是….. 你應該看你的用途、去決定使用哪種語言
JAVA、JSP、J2EE
優點:
1.高效能:
主要是因為JVM會動態的把JAVA虛擬碼編譯成C的關係
以及會依照運行狀態去調整他運行的方式
甚至把人寫的爛CODE去改寫成比較好的寫法之類的
不會比C慢太多

(繼續閱讀…)

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有個缺點,那就是….
(繼續閱讀…)

PHP 多執行緒解決方案

從JAVA跳到PHP之後,覺得PHP是種簡單的語言,以前用JAVA要寫好多行的程式,用PHP只要兩三行就能解決了。

但是我一直認為PHP就是因為太簡單,導致需要有些特殊的功能需要很花工夫才能達成,例如多執行緒。

現在,我找到解決方案了。

(繼續閱讀…)

程式人的心酸-你準備好要進軟體業了嗎?

靠JAVA吃飯吃了一年了

總覺得想像中的資訊業跟現實中的資訊業有一段很大的落差。

在技術上是沒遇到什麼太大的問題
因為一般的需求,在技術上都不會複雜到哪裡去…
頂多就是弄弄報表、輸入輸出資料、讀寫資料庫、檔案傳來傳去之類的而已
在大不了就是call api去跟其他東西串在一起

並不是每種程式都會用到一堆複雜的演算法、艱深的數學。決大多數都是,調調版面、報表的位置、內容,許多部分都是很枯燥乏味,而且缺乏創新、創造的。在工作之中,最常做的是「剪下貼上」,不是我不願意設計出方便重覆使用的程是架構,而是被主管要求要這樣做。

如果你對寫程式還擁有熱情,最好先看看下面這篇文章。

這是我前陣子遇到的案例,真的很扯。

(繼續閱讀…)

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

直接用個範例來說明:

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

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/04/28