实战java高并发程序设计-笔记进行中

《JAVA并发编程实践》:出书时间太早,内容比较散,专业术语翻译较早和现在有差异
《Java并发编程的艺术》:手绘图较多文字内容较少,主要讲解并发实现的底层原理和面临的问题,底层原理方面面试必考内容
《实战java高并发程序设计》:出书时间2014年时间很近。文字内容整理规范,专业术语规范,重在讲解相关概念,底层原理请参考上面的那本书《Java并发编程的艺术》

综上推荐书名《Java并发编程的艺术》,《实战java高并发程序设计》,阅读笔记进行中…随着阅读进展后面会同步更新相关的内容

相关概念

同步Ssynchronous,异步Asynchronous
在时间线上同时发生则是异步,必须前后顺序发生则是同步

并发Concurrency,并行Parallelism
并发在一个时间段内多个事件同时进行而实质上是依次串行的,并行在一个时间点上同时进行

临界区:多个线程竞争同一个资源,但每次只有一个线程能够使用其他线程则等待

阻塞Blocking,非阻塞Non-Blocking
对临界区资源进行使用时,未竞争到的线程就被挂起,这种情况对被挂起的线程来说就是阻塞的。
非阻塞则指没有一个线程会妨碍其他线程执行的情况

死锁Deadlock,饥饿Starvation,活锁Livelock
相互竞争所有线程都一直处于等待-红绿灯坏了相向堵车
低优先级的线程一直等待无法获取资源-廉租房
所有线程都相互谦让对方,使资源空闲在线程中切换而致使所有线程都处于等待状态-相互让路

并发级别
阻塞Blocking,
无饥饿Starvation-Free,所有线程都可以获取到资源-而非优先级高的,eg:阻塞队列
无障碍Obstruction-Free,没有阻塞都可以进入临界区,eg:乐观锁,AWS
无锁Lock-Free:无锁的并行都是无障碍的

JMM特点
原子性Atomicity:一个操作不可中断
可见性Visibility:线程之间修改彼此可见
有序性ordering:指令重排的前提是保证串行语义的一致性,但是对多线程并不保证语义一致性

指令重排必须遵守Happen-Before原则:这些原则保证指令重排不可违背

并行程序基础

进程(process)是系统资源分配和调度的基本单位,是当代面向线程设计的计算机结构中,进程是线程的容器。

线程的状态

这里写图片描述

a.start()方法,调用该方法开始执行该线程;
b.stop()方法,调用该方法强制结束该线程执行,无论是否执行完成,已经废弃不建议使用;
c.join()方法,调用该方法的线程让出CPU,等待该线程c执行结束才获取到CPU执行权,相当于这两个线程同步。
d.sleep()方法,调用该方法的线程进入等待,不会释放对象锁。
e.run()方法,调用该方法直接执行线程的run()方法,但是线程调用start()方法时也会运行run()方法,区别就是一个是由线程调度运行run()方法,一个是直接调用了线程中的run()方法!!
f.wait()和notify():要注意,其实wait()与notify()方法是Object的方法,不是Thread的方法!!同时,wait()与notify()会配合使用,分别表示线程挂起和线程恢复,wait()会释放对象锁。
g.suspend() 和 resume()方法:两个方法配套使用,suspend()使得线程进入阻塞状态,不会释放占用的锁(如果占用了的话),并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。典型地,suspend()和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume()使其恢复。
h.yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中

注意区别:

wait()与sleep()的区别,简单来说wait()会释放对象锁而sleep()不会释放对象锁。这些问题有很多的资料,不再赘述。
初看起来wait() 和 notify() 方法与suspend()和 resume()
方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的suspend()及其它所有方法在线程阻塞时都不会释放占用的锁(如果占用了的话),而wait()
和 notify() 这一对方法则相反。
如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

猜你喜欢

转载自blog.csdn.net/zjcjava/article/details/79474670