Java - 同步與鎖

package cn.itcast;

import java.util.Stack;

class Foo{
    private int x=100;

    public int getX(){
        return x;
    }
    
    public int fix(int y){
        x=x-y;
        return x;
    }
}

public class Test01 extends Thread {
    private Foo foo = new Foo();
    
    public static void main(String[] args) {
        Test01 r = new Test01();
        Thread ta = new Thread(r,"-ThreadA");
        Thread tb = new Thread(r,"-ThreadB");
        ta.start();
        tb.start();
    }
    
    @Override
    public void run() {
        for(int i=0;i<3;i++){
            this.fix(10);
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             System.out.println(Thread.currentThread().getName() + " : 當前foo對象的x值= " + foo.getX()); 
        }
    }
    
    public int fix(int y){
        return foo.fix(y);
    }
}

同步方法:java

關於鎖和同步,有一下幾個要點:
1)、只能同步方法,而不能同步變量和類;
2)、每一個對象只有一個鎖;當提到同步時,應該清楚在什麼上同步?也就是說,在哪一個對象上同步?
3)、沒必要同步類中全部的方法,類能夠同時擁有同步和非同步方法。
4)、若是兩個線程要執行一個類中的synchronized方法,而且兩個線程使用相同的實例來調用方法,那麼一次只能有一個線程可以執行方法,另外一個須要等待,直到鎖被釋放。也就是說:若是一個線程在對象上得到一個鎖,就沒有任何其餘線程能夠進入(該對象的)類中的任何一個同步方法。
5)、若是線程擁有同步和非同步方法,則非同步方法能夠被多個線程自由訪問而不受鎖的限制。

6)、線程睡眠時,它所持的任何鎖都不會釋放。併發

7)、線程能夠得到多個鎖。好比,在一個對象的同步方法裏面調用另一個對象的同步方法,則獲取了兩個對象的同步鎖。
8)、同步損害併發性,應該儘量縮小同步範圍。同步不但能夠同步整個方法,還能夠同步方法中一部分代碼塊。
9)、在使用同步代碼塊時候,應該指定在哪一個對象上同步,也就是說要獲取哪一個對象的鎖。例如:
    public int fix(int y) {
        synchronized (this) {
            x = x - y;
        }
        return x;
    }
 
固然,同步方法也能夠改寫爲非同步方法,但功能徹底同樣的,例如:
    public synchronized int getX() {
        return x++;
    }
    public int getX() {
        synchronized (this) {
            return x;
        }
    }
效果是徹底同樣的。
 
3、靜態方法同步
 
要同步靜態方法,須要一個用於整個類對象的鎖,這個對象是就是這個類(XXX.class)。
例如:
public static synchronized int setName(String name){
      Xxx.name = name;
}
等價於 public static int setName(String name){       synchronized(Xxx.class){             Xxx.name = name;       } }
相關文章
相關標籤/搜索