1. 程式人生 > >java執行緒安全,同步,非同步

java執行緒安全,同步,非同步

執行緒是比程序更小的執行單位,是在程序基礎上進行的進一步劃分。所謂多執行緒是指程序在執行過程中可以產生多個同時存在、同時執行的執行緒。多程序機制可以合理利用資源,提高程式的執行效率。一個程序至少包含一個執行緒(JVM虛擬機器的啟動是多執行緒的,至少有兩個執行緒:main 和垃圾回收機制)。

1、什麼是執行緒安全?

程序在執行時為了更好的利用資源提高執行效率,會產生多個執行緒,但是這多個執行緒執行時,會對同一個資源同時進行操作,也稱之為執行緒非同步,例如:執行緒A,B在對同一個連結串列進行操作時,如果出現了A對連結串列進行讀取的同時,執行緒B同時對其進行寫入資料。顯然這樣是非常不好的。那麼就需要執行緒同步。

2、何為執行緒同步?

執行緒同步:通俗而言就是,當執行緒A在對某一資源進行操作時,那麼執行緒B以及其他執行緒就必須等待,此時不能對這一資源進行操作。即執行緒A、B按照預定的計劃對這一資源進行非同時訪問。

3、執行緒安全:對於執行緒非同步,這樣的執行緒在執行時是不安全的,所以就引進同步。

//java中實現多執行緒有兩種方法,繼承自Thread類,實現Runnable介面。
//1 繼承自Thread介面需要實現run方法,
public class  ThreadDemo extends Thread{
    private String name;
    public ThreadDemo(String name){
        this.name=name;
    }
    //重寫Thread類中的run方法
    public void run(){
        for(int i=0;i<=10;i++){
            System.out.println(name+"執行i="+i);
        }
    }
    public static void main(String [] name){
        new ThreadDemo("執行緒A").start();
        new ThreadDemo("執行緒B").start();
    }
}
結果證明:執行緒A,B交錯執行。

public class RunnableDemo implements Runnable{
    private String name;
    public RunnableDemo(String name){
        this.name=name;
    }
    @Override
    public void run() {
        for(int i=1;i<=15;i++){
            System.out.println(name+"執行i="+i);
        }
        
    }  
    public static void main(String [] args){
        RunnableDemo demo1=new RunnableDemo("執行緒A");
        RunnableDemo demo2=new RunnableDemo("執行緒B");
        Thread thread1=new Thread(demo1);//例項化Thread類
        Thread thread2=new Thread(demo2);//例項化Thread類
        thread1.start();//啟動執行緒
        thread2.start();//啟動執行緒
    }
}
//注意啟動多執行緒必須使用Thread類實現

Thread類與Runnable介面的區別,如果繼承自Thread類,不適合多個執行緒共享資源,而實現了Runnable介面可以方便的實現資源共享。

public class ThreadDemo2 extends Thread{
    private String name;
    private int ticket=15;
    public void run(){
        for(int i=0;i<=15;i++){
            if(ticket>0){
                System.out.println(name+"賣票:ticket="+ticket--);
            }
        }
    }
    public ThreadDemo2(String name){
        this.name=name;
    }
    public static void main(String[] args){
        ThreadDemo2 demo1=new ThreadDemo2("執行緒A");
        ThreadDemo2 demo2=new ThreadDemo2("執行緒B");
        ThreadDemo2 demo3=new ThreadDemo2("執行緒C");
        new Thread(demo1).start();
        new Thread(demo2).start();
        new Thread(demo3).start();
    }
}
//結果證明執行緒A,B,C都各自賣出15張票


public class RunnableDemo2 implements Runnable{
   private int ticket=10;
    
    public void run() {
        for(int i=1;i<=5;i++){
            if(ticket>0){
                System.out.println("賣票:ticket="+ticket--);
            }
        }        
    }
    public static void main(String[] args) {
        RunnableDemo2 demo1=new RunnableDemo2();
        new Thread(demo1).start();
        new Thread(demo1).start();
        new Thread(demo1).start();
    }
}
//結果如下:賣票:ticket=10
賣票:ticket=9
賣票:ticket=8
賣票:ticket=7
賣票:ticket=6
賣票:ticket=5
賣票:ticket=4
賣票:ticket=3
賣票:ticket=2
賣票:ticket=1

實現Runnable介面與繼承自Thread類在實現多執行緒中相比具備以下優勢

(1) 適合多個具有相同程式程式碼的執行緒處理同一資源

(2)避免java單繼承特徵帶來的侷限

(3)程式碼能夠被多個執行緒共享且資料獨立存在,從而增強了程式的健壯性。

4、執行緒同步

同步是指同一時間段內只能執行一個執行緒,其他執行緒需要等待此執行緒完成後才可繼續執行。同步可以解決執行緒中資源共享的安全問題,主要有同步程式碼塊和同步方法兩種方式完成。

1)同步程式碼塊格式

synchronized(同步物件){

需要同步的程式碼塊

}

public class SynchronizedDemo implements Runnable{
    private int ticket=5;
    public void run() {
        for(int i=1;i<=5;i++){
            synchronized (this) {
                if(ticket>0){
                    try{
                        Thread.sleep(1000);
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    System.out.println("賣票:ticket="+ticket--);
                }
                
            }
        }        
    }
    public static void main(String[] args) {
        SynchronizedDemo demo1=new SynchronizedDemo();
        new Thread(demo1).start();
        new Thread(demo1).start();
        new Thread(demo1).start();
    }
}

結果如下:

賣票:ticket=5
賣票:ticket=4
賣票:ticket=3
賣票:ticket=2
賣票:ticket=1

如果沒有加入執行緒同步方法,則賣票會出現負數

另外有同步方法

格式如下:

synchronized 方法返回型別方法名稱(引數列表){

}

5、執行緒的生命週期/

1)建立狀態

2)就緒狀態

3)執行狀態

4)阻塞狀態

5)終止狀態

相關推薦

java執行安全同步非同步

執行緒是比程序更小的執行單位,是在程序基礎上進行的進一步劃分。所謂多執行緒是指程序在執行過程中可以產生多個同時存在、同時執行的執行緒。多程序機制可以合理利用資源,提高程式的執行效率。一個程序至少包含一

java執行總結--synchronized關鍵字原理以及相關的鎖

在多執行緒程式設計中,synchronized關鍵字非常常見,當我們需要進行“同步”操作時,我們很多時候需要該該關鍵字對程式碼塊或者方法進行鎖定。被synchronized鎖定的程式碼塊,只能同時有一條執行緒訪問該程式碼塊。 上面是很多人的認識,當然也是我之前對synchronized關鍵字的淺

高併發程式設計系列:4種常用Java執行鎖的特點效能比較、使用場景

高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景 http://youzhixueyuan.com/4-kinds-of-java-thread-locks.html   在Java併發程式設計中,經常遇到多個執行緒訪問同一個 共享資源 ,這時候作為開發者

4種常用Java執行鎖的特點效能比較、使用場景

文章目錄 多執行緒的緣由 多執行緒併發面臨的問題 4種Java執行緒鎖(執行緒同步) Java執行緒鎖總結 多執行緒的緣由 在出現了程序之後,作業系統的效能得到了大大的提升。雖然程序的出現解決了作業系統的併

JAVA執行有哪些狀態這些狀態之間是如何轉化的?

新建(new):新建立了一個執行緒物件。可執行(runnable):執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取cpu 的使用權 。執行(running):可執行狀態(run

Java執行池詳解看這篇就夠了!

構造一個執行緒池為什麼需要幾個引數?如果避免執行緒池出現OOM?Runnable和Callable的區別是什麼?本文將對這些問題一一解答,同時還將給出使用執行緒池的常見場景和程式碼片段。 基礎知識 Executors建立執行緒池 Java中建立執行緒池很簡單,只需要呼叫Execu

【本人禿頂程式設計師】Java執行池詳解看這篇就夠了!

←←←←←←←←←←←← 快!點關注!!! 構造一個執行緒池為什麼需要幾個引數?如果避免執行緒池出現OOM?Runnable和Callable的區別是什麼?本文將對這些問題一一解答,同時還將給出使用執行緒池的常見場景和程式碼片段。 基礎知識 Executors建立執行緒池 J

JAVA執行的Factory類以便自定義執行

package com.opensource; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomi

簡單測試Java執行安全中阻塞同步與非阻塞同步效能

摘抄自周志明老師的《深入理解Java虛擬機器:JVM高階特性與最佳實踐》13.2.2 執行緒安全的實現方法 1.名詞解釋 同步是指鎖哥執行緒併發訪問共享資料時,保證共享資料同一時刻只被一個執行緒訪問 互斥同步(阻塞同步)是一種悲觀的併發策略,總是認為只要不去做正確的同步措施(加鎖),那就肯定會出現問題。 阻塞

Java執行執行安全同步例項

1.1    執行緒安全與同步例項 1.1.1  購票同步物件鎖 【 /*  * 用程式模擬鐵路售票系統:實現通過兩個售票點發售某日某次列車的50張車票,  * 一個售票點用一個執行緒表示  */ publicclass SyncDemo {          publi

Java執行之釋放鎖釋放資源釋放CPU

多執行緒中的wait與sleep到底誰釋放了鎖 首先,多執行緒中會使用到兩個延遲的函式,wait和sleep。 wait是Object類中的方法,而sleep是Thread類中的方法。 sleep是Thread類中的靜態方法。無論是在a執行緒中呼叫b的sl

java執行安全問題以及同步的幾種方式

一、執行緒併發同步概念執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他執行緒也

4種常用Java執行鎖的特點效能比較及使用場景

開發十年,就只剩下這套架構體系了! >>>   

java執行的五大狀態阻塞狀態詳解

# 一、狀態簡介 一個執行緒的生命週期裡有五大狀態,分別是: 1. 新生 2. 就緒 3. 執行 4. 死亡 5. 執行後可能遇到的阻塞狀態 # 二、相關方法 ## 2.1 新生狀態 ```java Thread t = new Thread(); ``` 正如我們前面所說的

Java執行安全

執行緒不安全的類: HashMap LinkedHashMap TreeMap ArrayList LinkedList HashSet TreeSet LinkedHashSet StringBuilder 執行緒安全的類: ConcurrentHashMap Hasht

Java執行安全與多執行開發

網際網路上充斥著對Java多執行緒程式設計的介紹,每篇文章都從不同的角度介紹並總結了該領域的內容。但大部分文章都沒有說明多執行緒的實現本質,沒能讓開發者真正“過癮”。 從Java的執行緒安全鼻祖內建鎖介紹開始,讓你瞭解內建鎖的實現邏輯和原理以及引發的效能問題,接著說明了Java多執行緒程式設計中鎖的存在是為

Java執行之Synchronized同步————Java學習之路(17)

前言——不進則退啊,部落格幾天沒寫,排名第一次下降了,得勤奮更新,不能偷懶。。 歡迎轉載,轉載請註明來處。 目錄 一.演示同步問題 此前,我們用的多執行緒都是較為簡單的例子,都沒有涉及到多個執行緒共享同一個物件或者資源的情況。倘若多執行緒共享資

java執行安全問題

併發搶票過程中,如果不加同步鎖,就會出現執行緒不安全問題,導致程式碼執行結果出現嚴重問題。另外同一個執行緒啟動多次是不允許的。package sx.test.thread;public class TicketDemo {public static void main(Str

Java-執行安全

Java-執行緒安全 0x01 什麼是執行緒安全 執行緒安全是針對某個物件來說,如果當多執行緒訪問此物件時,不用再用額外方式如同步鎖等,總能執行獲得正確結果,那就可以說這個物件程式碼執行緒安全。 0x02 Java中的執行緒安全 Java中執行緒安全強度由強到弱是: 不可

關於java執行安全問題

執行緒:負責一個程序中的程式碼執行。執行緒是程序中的一個執行路徑。 執行緒安全問題出現的根本原因:1. 存在著兩個或者兩個以上的執行緒。2. 多個執行緒共享了著一個資源, 而且操作資源的程式碼有多句。 執行緒安全問題的解決方案:1. 使用同步程式碼塊格式:synchroni