国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

同步和異步的概念

2019-11-14 09:09:19
字體:
來源:轉載
供稿:網友

一,同步

 通俗的來講就是,比如上公交車,同步就相當于排隊上車,大家都是有順序的,只有等前一個人上了公交車以后,下一個才能上車。

如果不使用同步的話,會造成如下圖所示的狀況:

這是沒有使用同步的代碼:
public class ThreadDemo {		/**	 * 打印名字	 * @param name	 */	public void showName(String name){		for(int i=0;i<name.length();i++){			System.out.PRint(name.charAt(i));		}		System.out.println();	}	public static void main(String[] args){			 ThreadDemo t=new ThreadDemo();				new Thread(){			@Override			public void run() {				while(true){					t.showName("鋼鐵俠");				}			}		}.start();				new Thread(){			public void run() {				while(true){					t.showName("美國隊長");				}			}		}.start();	}} 

為了解決類似這種情況,應該引入同步的概念,也就是給方法加鎖,當其他線程調用該方法時,如果鎖解開了才能調用,如果沒有,則不能調用。java中同步的關鍵字是synchronzied,如果方法不加鎖,則會出現意想不到的結果。使用synchronzied有兩種方法,這里我舉一個比較省事的方法
public class ThreadDemo {		/**	 * 打印名字	 * @param name	 */	public synchronized void showName(String name){		for(int i=0;i<name.length();i++){			System.out.print(name.charAt(i));		}		System.out.println();	}	public static void main(String[] args){			 ThreadDemo t=new ThreadDemo();				new Thread(){			@Override			public void run() {				while(true){					t.showName("鋼鐵俠");				}			}		}.start();				new Thread(){			public void run() {				while(true){					t.showName("美國隊長");				}			}		}.start();	}}TipS:在JDK1.5及以后,在Java.util.concurrent.locks包下面提供了Lock接口,Lock實現提供了比使用synchronized方法和語句可獲得更廣泛的鎖定操作,此實現允許更靈活的結構,可以具有差別很大的屬性。舉個模仿火車票買票系統:假設某一站只有100張火車票,有200個人分別在不同的窗口買票,200人相當于兩百個線程,為了出現有人結賬是被告知票已經賣完的情況,買票的方法需要加上鎖。
import java.util.Random;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class TicketDemo {		private int Ticketcount=100;	private static int people=200;	private Lock lock = new ReentrantLock();	private static TicketDemo td=new TicketDemo();	public static void main(String[] args) {		for (int i = 0; i < people; i++) {			new Thread(){				@Override				public void run() {					super.run();					td.Buy();				}			}.start();		}	}	public void Buy(){		//上鎖		lock.lock();		try {			if(Ticketcount == 0){				System.out.println("已賣完");				return;			}		Random r = new Random();		try {			Thread.sleep(r.nextInt(1000));		} catch (InterruptedException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}		System.out.println("Ticketcount = "+Ticketcount);		System.out.println("還剩下:"+(--Ticketcount)+"張票");		} 		finally {			//解鎖			lock.unlock();		}	}}

二,異步

還拿公交車來講,異步就是大家一起上公交車,因為沒有秩序,也就是說上公交車不收限制。

總結:同步其實并不是同時.同步簡單說即使有順序,異步呢,是無序,所以可以同時發生。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁蒗| 崇仁县| 克拉玛依市| 玛纳斯县| 古丈县| 古蔺县| 察雅县| 哈巴河县| 淮北市| 互助| 柘城县| 东光县| 汾西县| 竹溪县| 丹寨县| 西昌市| 东莞市| 隆林| 浦江县| 宁武县| 云南省| 启东市| 阿勒泰市| 鄂伦春自治旗| 宜阳县| 大姚县| 巨鹿县| 建瓯市| 海口市| 什邡市| 景德镇市| 安庆市| 精河县| 杂多县| 罗平县| 忻州市| 新郑市| 台南市| 靖江市| 吉安县| 砀山县|