天天看點

JAVA線程中同步鎖(synchronized)的使用

為什麼用到同步鎖

在JAVA中CPU總是随機的給每個線程配置設定時間和資源,許多情況下許多線程用到一樣的資源,這樣的資源搶占就會遇到一些問題。就像是你為你暗戀的女生在她的生日宴會上買了一個蛋糕,吹完蠟燭之後準備切一塊蛋糕給那個女生,誰知道剛吹完蠟燭之後,蛋糕就被别人搶走了,等你搶到時候蛋糕已經分完了,然後你就奔潰了。而同步鎖(synchronized)的作用就是把蛋糕和你的手鎖在一起,等你把你的心意表達給你的女生之後别人才能拿到這個蛋糕。
           
public class Runnable_demo implements Runnable{  
        private String  cake="蛋糕";  
        public Runnable_demo(){       
        }  
        @Override  
        public void run() {  
         System.out.println("蠟燭吹滅了"+Thread.currentThread().getName()+"想送女神"+cake);
         try {
            Thread.sleep();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         System.out.println(Thread.currentThread().getName()+"送了"+cake);
        }  

         public static  void main(String args[]){  
             Runnable_demo demo=new Runnable_demo();  
             //你和其他人 
             new Thread(demo,"你").start();  
             new Thread(demo,"李明").start();  
             new Thread(demo,"其他").start();  
         }  
           

結果呢是這樣:

JAVA線程中同步鎖(synchronized)的使用

怎麼使用同步鎖

通過上面的步驟可以看出來,很可能别人先搶了蛋糕分完了,你卻白花了這個心思,感覺自己特别冤,那麼有什麼好辦法能夠解決這個問題。當然有了,要麼你特别牛,别人看見都不敢拿,不過在幾分鐘之内變壯還是不太現實,最好的辦法就是定一個規則:這個蛋糕是我買的,等我把我想幹完的事幹完了,你們再玩。

  1. 代碼塊加鎖

    “`

    public class Runnable_demo implements Runnable{

    private String cake=”蛋糕”;

    public Runnable_demo(){

    }

    @Override

    public void run() {

    synchronized(this){

    System.out.println(“蠟燭吹滅了”+Thread.currentThread().getName()+”想送女神”+cake);

    try {

    Thread.sleep(30);

    } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    System.out.println(Thread.currentThread().getName()+”送了”+cake+”\n”+”蛋糕已經沒了”);

    }

    }  
    
     public static  void main(String args[]){  
         Runnable_demo demo=new Runnable_demo();  
         //基于火車票建立三個視窗  
         new Thread(demo,"你").start();  
         new Thread(demo,"李明").start();  
         new Thread(demo,"其他").start();  
     }     
               
結果當然是你想要的結果:
![這裡寫圖檔描述](https://img-blog.csdn.net/20170812163124698?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY1MjI2NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

 2. 方法加鎖

           

public class Runnable_demo implements Runnable{

private String cake=”蛋糕”;

public Runnable_demo(){

}

@Override

public void run() {

runPre();

}  
    public  synchronized void  runPre(){
         System.out.println("蠟燭吹滅了"+Thread.currentThread().getName()+"想送女神"+cake);
         try {
             Thread.sleep(30);
            } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
            }
         System.out.println(Thread.currentThread().getName()+"送了"+cake+"\n"+"蛋糕已經沒了");
    }
     public static  void main(String args[]){  
         Runnable_demo demo=new Runnable_demo();  
         //基于火車票建立三個視窗  
         new Thread(demo,"你").start();  
         new Thread(demo,"李明").start();  
         new Thread(demo,"其他").start();  
     }  
           

“`

結果是沒有變的,不過為了diamagnetic修改更加便捷,不做讓人恨的霸王,最好選擇在代碼塊上加鎖。