為什麼用到同步鎖
在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();
}
結果呢是這樣:

怎麼使用同步鎖
通過上面的步驟可以看出來,很可能别人先搶了蛋糕分完了,你卻白花了這個心思,感覺自己特别冤,那麼有什麼好辦法能夠解決這個問題。當然有了,要麼你特别牛,别人看見都不敢拿,不過在幾分鐘之内變壯還是不太現實,最好的辦法就是定一個規則:這個蛋糕是我買的,等我把我想幹完的事幹完了,你們再玩。
-
代碼塊加鎖
“`
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(); }
結果當然是你想要的結果:

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修改更加便捷,不做讓人恨的霸王,最好選擇在代碼塊上加鎖。