在一般程序開發中可以使用synchronized同步多線程
阿新 • • 發佈:2019-01-15
syn set 但是 and 替換 其它 art one 每一個 假設:有兩個boy,都要玩同一個toy,此時就會出現同步情況,必須一個玩好了,另一個才能玩。多線程也是這樣子。
如果程序不是高並發的場景,則使用synchronized線程同步足夠處理。
synchronized關鍵字解釋(synchronized(this)同步代碼塊也可以被替換為同步對象方法或者同步類方法,本質是一樣的):
-
多個線程,訪問同一個對象中的synchronized(this)同步代碼塊時,每一個線程需要串行得到執行。其他線程必須等待當前線程執行完以後才能執行。
-
當一個線程對象一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該對象中的非synchronized(this)同步代碼塊。
-
當一個線程訪問對象的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
- 當一個線程訪問對象的一個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同步多線程