線程間通訊方式 & 哲學家死鎖

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併發和特性有無限的知識,看完了這本書,能發覺的只是前面還有一個知識的海洋,所以如果是想進行工作,那麼還是應該掌握寫企業需要的知識,每天確定自己的路,相當重要。親,加油。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章