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(); } } }