多線程,多線程的安全性,鎖,線程的同步

 安全

1線程的基本知識多線程

線程在jdk裏有Thread類來描述,程序能夠經過繼承Thread類來實現多線程,也能夠經過實現Thread類子類的Runnable接口來實現多線程。併發

(1)繼承Thread類來實現多線程:繼承Thread類,而後重寫run方法,再經過建立對象可直接調用start方法,達到啓動線程的目的。用這種方法完成雙線程需求,它的線程和對象和線程任務同時實現,耦合性過高。此種方式的代碼體現;jvm

class Text extends Thread{函數

public void run(){工具

for(int i=0;i<4;i++){this

System.out.println(i);線程

}對象

}繼承

}

public class Demo123 {

public static void main(String[] args) {

Text t1=new Text();

Text t2=new Text();

t1.start();

t2.start();

}

}

(2)實現Runnable接口實現多線程:

Runnable是Thread的一個子類,它的子類中只有一個run方法,經過重寫run方法,再經過建立Thread對象來建立線程對象,將原類的對象做爲參數傳給Thread類的構造函數,此原類的對象就是線程任務,接下來調用start來啓動線程。此類方式將線程對象和線程任務分開,耦合性低。

代碼實例:

class Text implements Runnable{

public void run(){

for(int i=0;i<4;i++){

System.out.println(i);

}

}

}

public class Demo123 {

public static void main(String[] args) {

Text t=new Text();

Thread t1=new Thread(t);

Thread t2=new Thread(t);

t1.start();

t2.start();

}

}

2.線程中的異常:

線程中的異常一旦出現,jvm就會報出該線程的異常,main命名的爲主函數的異常,其餘就是Thread0,Thread1這樣依次類推。

3.線程的強化

在線程中可經過sleep(time),wait(可加time可不加),中止的線程可經過noteify來喚醒線程。

4.線程的安全性。

這是線程中很是重要的部分,線程在運行過程當中有三種狀態:

執行狀態:cpu有執行資格,有執行權

封閉狀態 cpu沒有執行資格,沒執行權

堵塞狀態 cpu有執行資格,沒執行權

多線程中的安全問題就是因爲第三中的堵塞狀態引發的,這樣的安全性問題在代碼運行時每每顯而易見的,咱們能夠經過synchronized()線程同步來解決安全問題。

Synchronized的代碼體現有二種:一種是同步代碼塊,一種直接同步方法、

同步代碼快的代碼實例:

class Text implements Runnable{

Object obj=new Object();

public void run(){

synchronized(obj){

for(int i=0;i<4;i++){

System.out.println(i);

}

}

}

}

同步方法的代碼實例:

class Text implements Runnable{

Object obj=new Object();

public synchronized void run(){

for(int i=0;i<500;i++){

System.out.println(i);

}

}

}

public class Demo123 {

public static void main(String[] args) {

Text t=new Text();

Thread t1=new Thread(t);

Thread t2=new Thread(t);

t1.start();

t2.start();

}

}

這裏編輯一下:同步不能直接做用在run方法上,當方法run被同步上鎖,那麼就變成了單線程,而不是雙線程了。

5 鎖

在線程同步中,須要用到一個工具---鎖。

鎖在代碼中的體現爲:

Synchronized(obj){

}

Obj就是鎖,鎖能夠爲任意的對象,在同一個多線程中,要保證線程的安全性,鎖必須是同一個。在同步代碼快中,鎖能夠是任意一個對象。在同步函數中,同樣存在鎖,鎖爲this.

這咱們能夠用兩個線程來驗證,一個線程用同步方法,一個用同步代碼塊,同步代碼塊的鎖名稱定位this.&#160; 線程的安全性能夠獲得解決。若是同步方法是個靜態方法,由於靜態方法不須要this.來訪問,隨着類的加載而加載。因此它的鎖爲類的class文件。

對於鎖,能夠這麼總結:多線程中安全性出現了問題,那麼就先去查看鎖是否爲同一個鎖。

6懶漢式單例模式中的併發問題

先看代碼實例:

class Single {

static Object obj=new Object();

private static Single s=null;

private Single(){}

public static Single getIntance(){

if(s==null){

synchronized(obj){

if(s==null){

s=new Single();

}

}

}

return s;

}

}

public class Demo123 implements Runnable {

public void run(){

Single.getIntance();

}

}

代碼分析:同步synchronized來解決線程的安全性問題,用兩次判斷來解決同步帶來的效率低的問題。

相關文章
相關標籤/搜索