Java高并发程序设计

1. 第一章 前言

为什么要设计并行?
	因为硬件瓶颈的限制,导致只能向并行方向发展.也因为某些业务模型的需要.
同步的几个重要概念?
	同步与异步:同步就是必须等上一个方法调用完毕以后才能继续向后执行,
异步就是当上一个方法或程序在没有执行完成之前,可以继续向后执行,而不用等待上一个方法或程序调用完成.
!(https://img-blog.csdn.net/20181008224255348?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzYzODky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
	
	并发和并行:并行就是两条线程同时执行,而并发则是一条线程来回切换时间片.
	!(https://img-blog.csdn.net/20181008224559697?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzYzODky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
	
	临界区:表示一块共享数据,所有线程都可以访问,但是同一时刻,只能有一个线程访问.一旦临界区被占用,其他其他线程想要再使用临界区,则必须等待临界区资源被释放(类似于方法中加锁的部分).
	!(https://img-blog.csdn.net/20181008225230433?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzYzODky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
	
	阻塞与非阻塞:阻塞就好比国庆节的告诉公路,前面路都被堵了,只能等前面的车都通过以后再继续前进,而非阻塞则相当于平常的告诉公路,前面没有车堵路,所以可以一直执行下去.
	
	
	锁.饥饿和活锁:死锁好比一个十字路口,A车想向右走,B车想向下走,C车想向左右,D车想向上走,结果导致谁都走不了,但是再死锁期间,是不会占用CPU的资源的. 饥饿是指某一个或多个程序因为种种原因无法获得所需要的资源,导致一直无法执行.假如两个线程都需要AB资源来执行程序,但是其中一个线程只获得A资源,而另一个线程获得了B线程,两个线程为了彼此都能继续执行下去,会选择都释放自己手中的资源来让对方继续执行,然后导致两个线程一直在相互谦让,最终谁都无法执行,这便是活锁!
	 
	并行的级别:
		1.阻塞:当一个线程进入临界区以后,其他线程必须等待!
		2.无障碍:-无障碍是一种最弱的非阻塞调度.
		         -自由出入临界区.
		         -无竞争时,有限步内完成操作.
		         -有竞争时,回滚数据.
		3.无锁: -时无障碍的,
		        -保证有一个线程可以胜出.
		4.无等待:-无锁的.
		         -要求所有的线程必须在有限步内完成.
		         -无饥饿的.

有关并行的两个重要概念

**阿姆达尔定律**
  -定义了串行系统并行化后的加速比的计算公式和理论上限.
  -加速比定义:加速比=优化前系统耗时/优化后系统耗时
**古斯塔夫森**![在这里插入图片描述](https://img-blog.csdn.net/20181008232153490?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzYzODky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
  -说明处理器个数,串行比例和加速比之间的关系.
  -只有要足够的并行化,那么加速比和CPU个数成正比.

2.第二章 多线程基础

  • 什么是线程
  •   线程是进城的执行单元.
    
  • 线程的基本操作
  •   新建线程.
    
  •   终止线程.
    
  •   中断线程.
    
  •   挂起和继续执行线程.
    
  •   等待线程结束和谦让.
    
  • 守护线程
  •   在后台默默地完成一些系统性的服务,比如垃圾回收线程,JIT线程就可以理解为守护线程.  
    
  •   当一个Java应用内,只有守护线程时,Java虚拟机会自动退出.
    
  • 线程优先级
  •   高优先级的线程更容易在竞争中获胜!
    
  • 基本的线程同步操作
  •   SynSynchronized(同步锁),	
    
  •   Object.wait()  Object.notify()
    

3.第三章 Java内存模型和线程安全

  • 原子性
    • 	原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰.
      
    • 有序性
    • 	在并发时,程序的执行可能就会出现乱序.		
      
    • 	一条指令的执行是可以分为很多步骤的:
      
    • 	1.取值 IF	
      
    • 	2.译码和取寄存器操作数 ID		
      
    • 	3.执行或者有效地址计算 EX	
      
    • 	4.存储器访问 MEM	
      
    • 	5.写回 WB
      
    • 可见性
    • 	可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改.   
      
    • 	--Java虚拟机层面的可见性.
      
    • Happen-Before
    • 	程序顺序原则:一个线程内保证语义的串行性.
      
    • 	volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性.
      
    • 	锁规则:解锁(unlock)必然发生在随后的加锁(lock)前.
      
    • 	传递性:A先于B,B先于C,那么A必然先于C.
      
    • 	线程的start()方法先于它的每一个动作.
      
    • 	线程的所有操作先于线程的终结.
      
    • 	线程的中断先于被中断线程的代码.
      
    • 	对象的构造函数执行结束先于finalize()方法.
      
    • 线程安全的概念
    • 	指某个函数,函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成.
      

你可能感兴趣的:(JVM)