package threads;
/**
* 这里演示可能产生同步安全问题时如何提高并发效率
* 简单来讲就是,有效减小同步范围,将可能同步操作的地方进行处理即可
*/
public class SyncDemo2 {
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();
}
};
Thread t3 = new Thread(){
public void run(){
shop.buy();
}
};
Thread t4 = new Thread(){
public void run(){
shop.buy();
}
};
t1.start();
t2.start();
t3.start();
t4.start();
}
}
/**
* 这里设计一个例子,以简单的购物为例子
* 假设有一个服装店只有一个试衣间,顾客有很多,都在挑衣服,那么挑好衣服就需要去试衣服,试衣间只有一个就可能造成同步问题,都在抢这个试衣间
* 那么我们如何提高这样的并发效率呢,就是单独处理这个试衣服的行为就行了,
*
* 这里使用了同步代码块的设计,提高并发效率
* 挑衣服和结账离开不需要同步进行,只需要针对试衣服进行同步处理即可
* 实现效果就是试衣服是按照先后排队来的,其他的都是随机先后的
*/
class Shop {
public void buy() {
try {
Thread t = Thread.currentThread();
System.out.println(t+"正在挑衣服...");
Thread.sleep(5000);
/**
* 这里使用synchronized上锁试衣服的操作,就行程了同步代码块
* 同步代码块需要指定同步监视器,即指定上锁的对象
* 若希望该同步代码块有效果,必须保证多个线程看到的锁对象相同,通常使用this
*/
synchronized(this){
System.out.println(t+"正在试衣服...");
Thread.sleep(5000);
}
System.out.println(t+"结账离开...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}