《Java高并发程序设计》–基本概念
同步和异步
同步:是一个方法被调用后只有等这个方法执行完后调用者才能调用其它方法
异步:是调用者在调用一个方法后,该方法还未执行完调用者就重新获得了调用权可以调用其它方法。
并行和并发
并行:多个CPU同时做不同的事,比如在黄山旅游,我们坐缆车的时候可以同时看风景,这样在观看风景时又做了 走路的工作。
并发:一个CPU交替做不同的事,比如旅游我们步行的时候,我们走路的时候要专心走路不能看风景,看风景的时 候要停下来看风景,交替的进行。
临界区:表示一种公共资源或者是共享数据,就是线程同步机制中的共享数据。
死锁、饥饿、活锁
死锁:多个线程间抢占着其它线程需要的资源不肯放弃,导致所有线程都无法执行
饥饿:一个或多个线程无法获得所需要的资源,导致一直无法执行,例如高优先级的线程抢占了太多资源,低优先 级的线程由于无法获得资源而无法执行,但这种情况有可能伴随着高优先级的资源释放其它线程可以被执 行。
活锁:线程间由于谦让相互不断释放自己的资源导致没有一个线程可以获得完整资源,导致无法正常执行。
并发级别
1)阻塞:线程被挂起
2)无饥饿:线程间的调度都是公平的,没有优先级之分
3)无障碍:线程间都可以同时进入临界区(共享资源区),如果线程间没有发生冲突即同时修改共享数据,那么就 可以顺利完成任务,如果发生了冲突,那么所有线程进行回滚重新执行。这样有可能会导致所有线程
一直回滚。
一种解决方案就是可以依赖一个“一致性标记”,线程进入临界区前读取保存这个标记,当操作完成之后
检测这个标志有没有被改变,如果改变了则线程需要回滚,所有对资源有修改操作的线程在修改数据 前都需要更新这个标记,表示数据不再安全。
4)无锁:所有线程都可以对临界区进行访问,如果没有冲突则程序退出,如果有冲突,则至少有一个线程会竞争
修改成功退出,其它没有竞争赢的线程会继续不断的进行尝试直到修改成功。但由于有些线程可能因为
优先级低一直没有修改成功而一直执行,类似于饥饿现象。
5)无等待:这是在无锁的基础上更进一步,就是所有的线程在有限步都必须完成。
并行的两个重要定律
加速比定义
加速比=优化前系统耗时/优化后系统定时。
①Amdahl定律:该定律就是说明提高系统的速度,仅增加处理器对于速度的提升是有一个上限的,因为一段程 序有一个串行比例,所以需要提高系统内并行模块
②Gustafson定律:该定率就是说在串行比例很小的情况下,如果不断增加处理器个数,那么系统的速度是可以 不断提升的
JMM —java内存模型
保证多线程有效和正确定执行。JMM的关键技术就是围绕三个技术
1)原子性:原子性是指一个操作不管是多线程还是单线程,一旦一个操作开始,那么就不会被其它线程干扰
2)可见性:一个线程修改了某一个共享变量时,其它线程能否立即知道这个修改
3)有序性:一个程序在并发执行时有可能由于指令重排操作会导致执行顺序不是从前往后依次执行
java解决可见性原则
Happen-Before原则
1)程序顺序原则:一个线程内,按照代码顺序,前面的书写的操作执行优先于后面书写的操作
2)锁定原则:一个unlock操作先于发生于后面对同一锁的lock操作
3)volatile变量原则:对一个变量的写操作先于发生对这个变量的读操作
4)传递原则:如果操作A先于操作B执行,B先于C发生执行,那么A先于C执行
5)线程启动原则:Thread对象的start()方法先于发生于此线程的每一个操作
6)线程中断原则:对线程interrupt()方法的调用先行发生于此中断线程的代码检测到中断事件的发生
7)对象的终结规划:一个对象的初始化完成先于发生于它的finalize()方法的开始