offer 108
2014-5-16(週五)
1. Java 多線程編程時出現的泛型錯誤
java 使用了未經檢查或者不安全的操作
只需要給使用的容器加上泛型就可以,博文來源
2. 昨天有一副圖片可以表示線程間通訊方式:
1)下面給出《thinking in java》中的管道通訊程序:
import java.io.*;
import java.util.*;
class Sender extends Thread{
private Random rand = new Random();
private PipedWriter out = new PipedWriter();
public PipedWriter getPipedWriter() {return out;}
public void run(){
while(true){
for(char c='A';c <= 'z';c++){
try{
out.write(c);
sleep(rand.nextInt(500));
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
}
}
class Receiver extends Thread{
private PipedReader in;
public Receiver(Sender sender) throws IOException{
in = new PipedReader(sender.getPipedWriter());
}
public void run(){
try{
while(true){
System.out.println("Read: "+(char)in.read());
}
}catch(IOException e){
throw new RuntimeException(e);
}
}
}
public class PipedIO{
public static void main(String[] args) throws Exception{
Sender sender = new Sender();
Receiver receiver = new Receiver(sender);
sender.start();
receiver.start();
new Timeout(4000,"Terminated");
}
}
2)Java的鎖和synchronized關鍵字屬於內置的信號量機制,使用這兩者的方式都屬於信號量通信。
3)套接字顧名思義:socket與socketServer
3. 關於volatile關鍵字
在使用volatile替代鎖的條件:
1. 對變量的寫操作不依賴於當前值
2. 該變量沒有包含在具有其他變量的不變式中
IBM的博文對volatile進行了討論(2007年),個人讀後的領略是:
鎖(synchronized)具有:互斥性和可見性
volatile:只具有可見性,只讀操作效率比鎖高,但是對++操作符(讀,寫,存儲)不具有原子性,原子性的就只有 賦值和返回(= 或者 return ** )
4. 關於死鎖
《thinking in java》裏面關於Philosopher的java實現挺精彩(3rd,Page753,英文版,中文版503頁),下面給出死鎖的四個條件,需同時滿足才能導致死鎖:
1)互斥條件,資源至少有一個不能共享,哲學家問題是,一棍筷子只能被一個哲學家使用
2)一個進程必須持有資源等待獲取另一個被別的進程持有的資源,一個哲學家拿着一根筷子等另一個哲學家的一根筷子
3)資源不能被進程搶佔,哲學家是很有素質滴,他們不搶別人的筷子。
4)循環等待,每個哲學家左手拿着一根筷子等另一個人右手的那根筷子
書中破壞死鎖的是條件4,最後一位哲學家取筷子的順序是先右後左,所以其他哲學家總有一個能拿到右手的筷子,死鎖就被破壞了。
5. 關於感想
讀了《thinking in java》的第13章,感覺對於併發,《thinking in java》裏面說到的也只是皮毛,以前那種快速把書看完的想法幾乎都不見了,重要的是領略,關於java併發和特性有無限的知識,看完了這本書,能發覺的只是前面還有一個知識的海洋,所以如果是想進行工作,那麼還是應該掌握寫企業需要的知識,每天確定自己的路,相當重要。親,加油。