熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

線程的互斥與同步通信問題

2013-11-23 19:50:46  來源: Java高級技術 
    package cnhingeyangjun;
   
    public class TraditionalThreadSynchronized {
   
    /*
   
    *   線程的安全 通過以下實例便可以理解為了防止沒有加線程同步鎖會導致線程之間因cpu 導致打印出的信息會亂
   
    *   啟動個線程 : a 線程打印 yangrenjun b 線程打印 yangtao  如果不加同步鎖側會出現 ing li 等信息
   
    *
   
    *   靜態方法中不能實例化內部類對象因為內部類一個重要特點就是可以訪問外部類的成員變量如果可以訪問外部成員變量意味一定存在
   
    *   實例對象而此時mian方法是靜態方法而靜態方法執行的時候可以不用實例化對象此時二者矛盾
   
    *   內部內不能訪問局部變量 要加關鍵字 final
   
    *
   
    *   線程的安全 多個線程對同一個對象進行訪問取這個對象中的數據並對數據進行操作比如銀行轉帳就是很明顯的線程安全實例
   
    *
   
    */
   
    public static void main(String[] args) {
   
    // 靜態方法中不能實例化內部類實例對象 為什麼呢?
   
    //回答靜態方法中不能實例化內部類對象因為內部類一個重要特點就是可以訪問外部類的成員變量如果可以訪問外部成員變量意味一定存在
   
    //實例對象而此時mian方法是靜態方法而靜態方法執行的時候可以不用實例化對象此時二者矛盾要通過外部對象調用內部對象才可以訪問(意思是想要實例化內部類必須要定義個外部對象)
   
    // final Outputer outputer = new Outputer()
   
    new TraditionalThreadSynchronized()init()
   
    }
   
    private void init(){
   
    final Outputer outputer = new Outputer() // 內部類不能訪問局部變量 要想訪問必須聲明是 fianl 類型的內部類內部類對象必須被外部類對象直接調用
   
    /* 線程 調用 output 方法*/
   
    new Thread(new Runnable(){
   
    public void run() {
   
    while(true){
   
    try {
   
    Threadsleep(
   
    } catch (InterruptedException e) {
   
    eprintStackTrace()
   
    }
   
    outputeroutput(linghongming
   
    }
   
    }
   
    })start()
   
    /* 線程 output 方法  */
   
    new Thread(new Runnable(){
   
    public void run() {
   
    while(true){
   
    try {
   
    Threadsleep(
   
    } catch (InterruptedException e) {
   
    eprintStackTrace()
   
    }
   
    outputeroutput(zhangxiaoxiang
   
    }
   
    }
   
    })start()
   
    }
   
    /* 定義一個內部類中定義一個方法專門打印一個用戶姓名如果不加同步鎖 側會出現線程安全會導致打出信息混亂如果要實現原子性那麼就必須加同步鎖同步鎖必須針對一個對象 */
   
    class Outputer{
   
    public synchronized void  output(String name){
   
    int len = namelength() // synchronized(this)這是另一種同步方法
   
    for (int i = ; i < len; i++) {
   
    Systemoutprint(namecharAt(i))
   
    }
   
    Systemoutprintln()
   
    }
   
    }
   
    }
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27557.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.