1. 程式人生 > >在一般程序開發中可以使用synchronized同步多線程

在一般程序開發中可以使用synchronized同步多線程

syn set 但是 and 替換 其它 art one 每一個

假設:有兩個boy,都要玩同一個toy,此時就會出現同步情況,必須一個玩好了,另一個才能玩。多線程也是這樣子。

如果程序不是高並發的場景,則使用synchronized線程同步足夠處理。

synchronized關鍵字解釋(synchronized(this)同步代碼塊也可以被替換為同步對象方法或者同步類方法,本質是一樣的):

  1. 多個線程,訪問同一個對象中的synchronized(this)同步代碼塊時,每一個線程需要串行得到執行。其他線程必須等待當前線程執行完以後才能執行。

  2. 當一個線程對象一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該對象中的非synchronized(this)同步代碼塊。

  3. 當一個線程訪問對象的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。

  4. 當一個線程訪問對象的一個synchronized(this)同步代碼塊時,它就獲得了這個對象的鎖。其它線程對該對象所有同步代碼部分的訪問都被暫時阻塞。

總之,synchronized是針對某個對象或者類對象進行鎖,同步代碼或者方法只是表象,實際上是鎖的對象,多個線程只要擁有相同對象,則對該對象的任何使用都將受到鎖的約束。如果擁有不同對象,則不同對象彼此間正常是沒有鎖的約束關系的,因此也就不存在多線程之間的同步了

如下toy是對toy的對象進行同步。

public class toy {
    private int number;
    public toy(){
        number = 100;
    }
    //一個時刻,只能一個boy拿到這個toy
    synchronized public void getToy()
    {

        number--;
        System.out.println(Thread.currentThread().getName() + " toy‘s total number reduced one! now : " + number);

    }
    //一個boy在玩toy,另外一個boy雖然不能玩,但是能看嘛
    public void showHello()
    {
        System.out.println(Thread.currentThread().getName()+"hello begin");
        try{
            int i = (int) (Math.random()*10000);
        System.out.println(i+"seconds");

        Thread.sleep(i);
        }
        catch(Exception e)
        {

        }
        System.out.println(Thread.currentThread().getName()+"hello end");

    }
    //一個時刻,只能一個boy對這個玩具進行paint
    synchronized public void paint()
    {
        System.out.println("thread:"+Thread.currentThread().getName() + ":paint begin");
        try{
            int i = (int) (Math.random()*10000);
        System.out.println(i+"seconds");

        Thread.sleep(i);
        }
        catch(Exception e)
        {

        }
        System.out.println("thread:"+Thread.currentThread().getName()+":paint");
        System.out.println("thread:"+Thread.currentThread().getName() + ":paint end");
    }
        //一個時刻,只能一個boy對這個玩具進行write
     synchronized public void write()
    {
        System.out.println("thread:"+Thread.currentThread().getName() + ":write begin");
        try{
            int i = (int) (Math.random()*10000);
        System.out.println(i+"seconds");
        Thread.sleep(i);
        }
        catch(Exception e)
        {

        }
        System.out.println("thread:"+Thread.currentThread().getName()+":write");
        System.out.println("thread:"+Thread.currentThread().getName() + ":write end");
    }
}

創建一個boy類,來使用toy


public class boy extends Thread{
    private toy mytoy;
    public boy(toy t)
    {
        mytoy = t;
    }
    public void run()
    {
        super.run();

        mytoy.write();
        mytoy.showHello();
        mytoy.paint();

    }

}

測試,有兩個boy,都要玩同一個toy,此時就會出現同步情況,必須一個玩好了,另一個才能玩。


public class Test {

    public static void main(String[] args) {
        toy mytoy = new toy();
        boy myboy = new boy(mytoy);
        boy youboy = new boy(mytoy);
        myboy.setName("myboy");
        youboy.setName("youboy");
        myboy.start();
        youboy.start();
    }

}

在一般程序開發中可以使用synchronized同步多線程