什麼是java的安全執行緒?同步,非同步

來源:互聯網
上載者:User

標籤:set   out   開始   amp   img   元素   void   settings   多進程   

線程是比進程更小的執行單位,是在進程基礎上進行的進一步劃分。所謂多線程是指進程在執行過程中可以產生多個同時存在、同時啟動並執行線程。多進程機制可以合理利用資源,提高程式的運行效率。一個進程至少包含一個線程(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)終止狀態

6、加入js的理解

先看一段代碼

var x = document.getElementsByName(data);var i;for (i = 0; i < x.length; i++) {   var value=x[i].id;   $.getJSON(ctx + ‘/sys/dict/description‘, {      value: value   }, function (data) {   var str = ‘&nbsp;<img src="/static/images/toolbox/description.png" title="‘+data.value+‘"/>‘;   $(‘.tooltip-description [desc=‘+value+‘]‘).append(str); });

本段代碼的意圖是根據元素名取得頁面上所有元素,然後逐個發送請求到後台,將根據該得到的資料在頁面上進行展示,代碼中,for迴圈應是一個原子操作,但$.getJSON()是非同步請求資料,第一個請求還沒結束,第二個就已經開始,導致資料混亂,因此應對for迴圈進行修改,使其變為安全執行緒,具體做法是在for迴圈之前加一段代碼:

var x = document.getElementsByName(data);var i;$.ajaxSettings.async = false;   for (i = 0; i < x.length; i++) {      var value=x[i].id;      $.getJSON(ctx + ‘/sys/dict/description‘, {         value: value      }, function (data) {      var str = ‘&nbsp;<img src="/static/images/toolbox/description.png" title="‘+data.value+‘"/>‘;      $(‘.tooltip-description [desc=‘+value+‘]‘).append(str);       });

 

什麼是java的安全執行緒?同步,非同步

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.