java高并发

线程生命周期:

 

并发级别

由于临界区的存在,多线程之间的并发必须受到控制,根据控制并发的策略,我们把并发的级别进行分类,大致可以分为阻塞、无饥饿、无障碍、无锁、无等待。

①、阻塞(Blocking)

  一个线程如果是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行,当我们使用 synchronized 关键字时,或者重入锁(后面会讲),我们得到的就是阻塞的线程。

  ②、无饥饿(Starvation-Free)

如果线程之间是有优先级的,那么线程调度的时候总是会倾向于满足高优先级的线程,也就是说,对于同一个资源的分配是不公平的。下图显示了公平和非公平两种情况(五角星表示高优先级线程)

对于非公平锁,系统允许高优先级线程插队,这样会导致低优先级线程产生饥饿。但如果锁是公平的,满足先来后到,那么饥饿就不会产生,不管新来的线程优先级多高,要想获得资源,都必须排队,那么所有线程都有机会执行。

 

指令重排序举例:a、b两个线程,a线程执行一个语句以后重排序,接下来不执行a的语句,执行b的语句,b执行完以后,a再往下执行,这时,公共变量有可能会变!但好处是可以提升处理器的执行效率。

 

Java内存模型(JMM:Java Memory Model)

并发程序为什么会比串行程序复杂很多?因为并发程序下数据访问的一致性和安全性很难控制,如何保证一个线程总是可以看到正确的数据?我们需要定义一种规则,保证多个线程能有效的、正确的协同工作,这就是Java的内存模型。而Java内存模型是围绕着如下几点来进行的:

  ①、原子性(Atomicity)

原子性是指一个操作不可中断,即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程所干扰。

  ②、可见性(Visibility)

可见性是指当一个线程修改了某一个共享变量的值,其它线程是否能够立即知道这个修改。除了缓存优化或者硬件优化(有些内存读写可能不会立即触发,而会进入一个硬件队列等待)会导致可见性问题外,指令重排以及编辑器的优化,都有可能会导致一个线程的修改不会立即被其他线程察觉。

  ③、有序性(Ordering)

对于一个线程的执行代码而言,我们总是习惯的认为代码的执行是从前往后,依次执行的,对于一个线程而言,确实会这样,但是对于多个线程,程序的执行可能会出现乱序,会给人一种错觉:写在前面的代码会在后面才执行。

有序性的问题原因是因为程序在执行时,可能会进行指令重排。注意,指令重排有一个基本前提是保证串行语义的一致性,指令重排不会使串行的语义逻辑发生问题。指令重排能减少CPU的流水线中断次数,因为每次中断流水线然后恢复会有比较大的性能损耗,而指令重排能减少中断次数。

所以指令重排虽然带来了乱序问题,但是对于提高CPU的性能是十分必要的。

  ④、Happen-Before 规则

虽然Java虚拟机和执行系统会对指令进行一些重排,但是指令重排是有原则性的,并非所有的指令都可以随便改变执行的位置,以下这些原则是指令重排不可违背的。

1、程序次序规则(Program Order Rule):在同一个线程中,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操纵。准确的说是程序的控制流顺序,考虑分支和循环等。

2、管理锁定规则(Monitor Lock Rule):一个unlock操作先行发生于后面(时间上的顺序)对同一个锁的lock操作。

3、volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面(时间上的顺序)对该变量的读操作。

4、线程启动规则(Thread Start Rule):Thread对象的start()方法先行发生于此线程的每一个动作。

5、线程终止规则(Thread Termination Rule):线程的所有操作都先行发生于对此线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。

6、线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断时事件的发生。Thread.interrupted()可以检测是否有中断发生。

7、对象终结规则(Finilizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()的开始。

8、传递性(Transitivity):如果操作A 先行发生于操作B,操作B 先行发生于操作C,那么可以得出A 先行发生于操作C。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值