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){
}
}
}*/
对试衣间试衣服加上同步块,确保同一时间只有一个线程可以使用;如果不加上同步块(被注释的内容)就会出现两个线程同时进入试衣服,这是不允许的;
还比如买火车票,两个或多个人买同一张票,一定要有互斥锁,不然会产生一张票卖个多个人的错误.