安全
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.  線程的安全性能夠獲得解決。若是同步方法是個靜態方法,由於靜態方法不須要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來解決線程的安全性問題,用兩次判斷來解決同步帶來的效率低的問題。