java并发学习_day02

来源:互联网 发布:动态地图制作软件 编辑:程序博客网 时间:2024/06/03 22:39

一、并发级别:我们学习了线程我们知道一个资源只能是被一个线程占用,所以资源就会有临界区的存在。由于并发的设计出现的关于资源的访问导致的并发问题,阻塞、无饥饿、无障碍、无锁、无等待等几种问题。

1.阻塞:在线程中我们加入sychronized或者是重入锁那么这个资源就是阻塞状态的资源,我们可以理解为在一条单行弯道上后面的车想要过这个弯道那么就必须等前面的车过完了它才能过,在这个期间内我们就叫做线程阻塞。

2.无饥饿:我们在设计线程程序的时候是可以指定线程的优先级,那么如果是在"非公平锁"的在线程调度的下一般情况下是倾向于级别高的线程的,这样子就是导致了在分配的过程中是不公平的,线程级别低的就会一直等待呈现出一种饥饿的状态。如果是"公平锁"的话那么在线程调度的时候就不会考虑线程级别的问题,就是会随机分配,所有线程都是乖乖的排队等待。这就是无饥饿。

3.无障碍:无障碍是一种弱的非阻塞调度,如果两个线程是无障碍的执行的话,就不会因为临界区的问题导致一方被挂起。两个线程就会一起修改共享数据,不过在出现数据错乱的时候这时候这两个线程就会回滚,保证数据的安全的正确。在这个过程中数据是用一个“一致性标记”来实现的。

4.无锁:无锁的并行都是无障碍的,在这个过程中所有的线程都会尝试的对临界区进行访问,但是无锁的并发会保证一个线程在有限的步骤内完成并且离开临界区。

5.无等待:是在无锁的基础上扩展,就是在无锁的基础是无饥饿无等待。


二、JMM(java内存模型):JMM围绕着在并发过程中如何处理线程的原子性、可见性、有序性而建立的模型。

1.原子性:原子性是指一个操作是不可中断的,即使多个线程一起执行,只要有一个线程开始了就不会被其余的线程中断或者是干扰。

2.可见性:所有线程共享一个数据的有效性,获取的必定是最新的最后一次被修改的数据。

3.有序性:线程在执行的时候有可能会对指令进行重排序与原来的指令排序未必一样。

重排序分为以下几种:
1)、编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
2)、指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-LevelParallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
3)、内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

























0 0
原创粉丝点击