Java线程(十)

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

 

上一篇:new/malloc的区别


下一篇:抽丝剥茧 Jetpack | Lifecycle 到底解决了什么问题?