Java.SE01.多线程_案例01



 1.有效的缩小同步范围可以再保证并发安全的前提下提高并发效率,同步块可以更精确的锁定需要同步执行的代码片段.

   举个生活例子:

        买衣服可以简化为三个步骤:①挑选衣服②试衣服③结账.

        在同一家店中多个顾客可以同时各自挑选衣服(①),假设只有一个试衣间,那么(②)同一时间 "只能一个人" 试衣服,结账也可以多人同时进行.

  

package day01;
/**
 * 有效的缩小同步范围可以再保证并发安全的前提下提高并发效率
 * 同步快可以更精确的锁定需要同步执行的代码片段
 * @author 爱吃木鱼的猫
 */
public class Demo01 {

	public static void main(String[] args) {
		final Shop shop=new Shop();
		Thread t1=new Thread(){//匿名内部类
			public void run(){
				shop.buy();
			}
		};
		
		Thread t2=new Thread(){
			public void run(){
				shop.buy();
			}
		};
		t1.start();
		t2.start();

	}

}
class Shop{
	public  void buy(){
		try{
		Thread t=Thread.currentThread();
		System.out.println(t.getName()+":正在优衣库挑选衣服...");
		Thread.sleep(3000);
		
		/**
		 * 同步块
		 * synchronized(同步监视器对象){
		 *    需要同步的代码片段
		 * }
		 *同步块可以更准确的指定需要同步执行的代码片段.但是需要注意的是多个线程之
		 *间若需要同步执行该段代码,看到的同步监视器对象必须是同一个!
		 *
		 *在方法上使用synchronized后,同步监视器对象为当前方法所属对象,即:this
		 * 
		 */
		synchronized(this){//方法中对象可以用this
			System.out.println(t.getName()+":正在试衣间试衣服...");
			Thread.sleep(3000);//3秒延迟
		}	
		System.out.println("结账离开");
		}catch(Exception e){
			
		}
	}
}


/*class Shop{
	public synchronized void buy(){
		try{
		Thread t=Thread.currentThread();
		System.out.println(t.getName()+":正在挑选衣服...");
		Thread.sleep(3000);						
		System.out.println(t.getName()+":正在试衣间试衣服...");
		Thread.sleep(3000);
		
		System.out.println("结账离开");
		}catch(Exception e){
			
		}
	}
}*/

Java.SE01.多线程_案例01_第1张图片Java.SE01.多线程_案例01_第2张图片

对试衣间试衣服加上同步块,确保同一时间只有一个线程可以使用;如果不加上同步块(被注释的内容)就会出现两个线程同时进入试衣服,这是不允许的;

还比如买火车票,两个或多个人买同一张票,一定要有互斥锁,不然会产生一张票卖个多个人的错误.

你可能感兴趣的:(Java)