并发必须知道的一些概念

标题并发必须知道的一些概念

本系列读《实战java高并发程序设计》有感(01)。

既然是并发编程,那么究竟什么是并发呢?
并发可以认为是多个任务同时进行,与并发相应还个概念是并行。而并发更侧重于任务的交替进行,并行则是真正的同时执行。对于单核CPU来说,只能是交替的并发执行,多核CPU上才能真正并行执行。

比如茶馆只有一个小二,为了让后来的顾客不至于干等,所以他一手拿茶水,一手拿瓜子,然后给A送茶水,再给B送瓜子,最后再给C送,再返回来给A送瓜子,交替服务这就并发。很显然并行就是再多雇几个店小二来同时给不同的客人送茶水。

说完并发我们再来聊聊同步(synchronous)与异步(asynchronous)。同步和异步都是形容方法调用,也就是说某个方法是同步方法还异步方法。同步方法,就是调用者必须等待方法执行完毕返回后,调用者才可以去执行后面的操作。而异步方法则是,被调用的方法会立刻返回,调用者就可以不用等待异步方法真正的执行逻辑。

这时茶馆又来一位顾客,小二拿着菜单跑过去问:客官要点什么?然后这位客官仔仔细细的慢慢看完了菜单,小二等了好久,才下完单。

那么这个下单行为可以看成是一个同步的order()方法,小二只有等下完单他才能去做其他的事情。异步方法就是小二跑过来给这个顾客一份菜单,纸和笔,让他把点的东西写在纸上就行,然后他就可以继续去干别的了,等点完单顾客直接叫下小二过来拿单就可以了。

最后再来说下阻塞(Blocking)和非阻塞(Non-Blocking)。
阻塞与非阻塞通常是用来多线程之间的相互影响。比如一个线程占用了一个共享资源,而这个共享资源同一时间只能由一个线程占用,那么当其他其他线程也想要访问该资源时,就必须等待,也就是阻塞。非阻塞则相反,一个线程不会妨碍其他线程的执行。

拿我们的茶馆来说,如果我们只有一份菜单时,这份菜单就是所有顾客的共享资源,同时每次也只能有一个顾客拿着这份菜单点单,A在点单时,B、C、D就只能等A点完后,后面才能点,这也就是阻塞。非阻塞就是我可以打印一份大的菜单,贴墙上,这样所有顾客就可以同时点单了。
上代码:

public class BlockingOrder {
    private List<String> menus = Arrays.asList("龙井", "碧螺春", "瓜子");


    /**
     * 这里加synchronized保证多线程操作menus时不会出错
     */
    public synchronized void order(String name) throws InterruptedException {
        Random random = new Random();
        //点餐花的时间
        Thread.sleep(1000);
        //为了简单只取一个
        System.out.println(name + "点了" + menus.get(random.nextInt(menus.size())) + ",点单时间:" + System.currentTimeMillis());
    }
}
public class NonBlockingOrder {
    /**
     * 构建一个不可修改的list这样就能在多线程下保证数据安全
     */
    private final List<String> menus = Collections.unmodifiableList(Arrays.asList("龙井","碧螺春","瓜子"));


    public void order(String name) throws InterruptedException {
        Random random = new Random();
        //点餐花的时间
        Thread.sleep(1000);
        //为了简单只取一个
        System.out.println(name + "点了" + menus.get(random.nextInt(menus.size())) + ",点单时间:" + System.currentTimeMillis());
    }
}

创建N个线程测试,可以明显看到非阻塞的点单几乎是同时的。

各位客官是否对这些概念有所了解呢?

客官请留步,扫一扫关注,有更多惊喜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值