多线程基础

来源:互联网 发布:spool导出数据不全 编辑:程序博客网 时间:2024/06/16 08:17
多线程的最底层依赖于Unsafe的compareAndSwap(CAS)和LockSupport的park和unpark操作。
cas需要传递两个参数:expect和update。先跟第一个参数expect进行比较,如果等于第一个参数,那么就将该值设置为第二个参数,
这是由硬件提供的原子操作,所以不会存在并发问题。cas会返回一个boolean值表示这次更新是否成功,通常会用循环去不断的尝试
直到更新成功为止。通俗的讲cas就是硬件级别的乐观锁。
park和unpark类似于wait和notify,不同的是wait和notify之间有先后顺序关系,必须先调用wait之后才能调用notify,如果先调用
notify后调用wait,那么调用wait的线程将会一直被阻塞。而park和unpark的实现类似二元信号量(0和1),调用park会去申请许可,如果许可被占用了
那么申请的线程就会被阻塞,直到其他线程调用unpark释放了许可。该许可默认是被占用的。说了这么多其实主要是要说明park和
unpark之间没有先后顺序的关系,可以先调用unpark,之后再调用park,这样park的线程不会被阻塞,直接正常运行。但是许可最多只有一个,调用
再多次的unpark也只会有一个许可供使用。
0 0
原创粉丝点击