Java并发知识点总结.pdf
Java并发知识点总结
前⾔:Java语⾔⼀个重要的特点就是内置了对并发的⽀持,让Java⼤受企业和程序员的欢迎。同时,如果想要提升⾃⼰的技术,Java并发
知识必不可少,这⾥简单整理了⼀些相关内容,希望可以起到抛砖引⽟的作⽤。
1,Java内存模型是什么?
Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地⾏为。它在多线程的情况下尤其重要。Java内存
模型对⼀个线程所做的变动能被其它线程可见提供了保证,它们之间是先⾏发⽣关系。这个关系定义了⼀些规则让程序员在并发编程时思路
更清晰。⽐如,先⾏发⽣关系确保了:
线程内的代码能够按先后顺序执⾏,这被称为程序次序规则。
对于同⼀个锁,⼀个解锁操作⼀定要发⽣在时间上后发⽣的另⼀个锁定操作之前,也叫做管程锁定规则。
前⼀个对volatile的写操作在后⼀个volatile的读操作之前,也叫volatile变量规则。
⼀个线程内的任何操作必需在这个线程的start()调⽤之后,也叫作线程启动规则。
⼀个线程的所有操作都会在线程终⽌之前,线程终⽌规则。
⼀个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
可传递性
更多介绍可以移步并发编程⽹:
2,Java中interrupted和isInterruptedd⽅法的区别?
interrupted()和isInterrupted()的主要区别是前者会将中断状态清除⽽后者不会。Java多线程的中断机制是⽤内部标识来实现的,调⽤
Thread.interrupt()来中断⼀个线程就会设置中断标识为true。当中断线程调⽤静态⽅法Thread.interrupted()来检查中断状态时,中断状态会被
清零。
⾮静态⽅法isInterrupted()⽤来查询其它线程的中断状态且不会改变中断状态标识。简单的说就是任何抛出InterruptedException异常的
⽅法都会将中断状态清零。⽆论如何,⼀个线程的中断状态都有可能被其它线程调⽤中断来改变。
,Java中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更⾼。在Java1.5之前程序员们只有同
步集合来⽤且在多线程并发的时候会导致争⽤,阻碍了系统的扩展性。Java5介绍了并发集合像ConcurrentHashMap,不仅提供线程安全还
⽤锁分离和内部分区等现代技术提⾼了可扩展性。
不管是同步集合还是并发集合他们都⽀持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全上。
同步HashMap,Hashtable,HashSet,Vector,ArrayList相⽐他们并发的实现(ConcurrentHashMap,CopyOnWriteArrayList,
CopyOnWriteHashSet)会慢得多。造成如此慢的主要原因是锁,同步集合会把整个Map或List锁起来,⽽并发集合不会。并发集合实现线
程安全是通过使⽤先进的和成熟的技术像锁剥离。
⽐如ConcurrentHashMap会把整个Map划分成⼏个⽚段,只对相关的⼏个⽚段上锁,同时允许多线程访问其他未上锁的⽚段。
同样的,CopyOnWriteArrayList允许多个线程以⾮同步的⽅式读,当有线程写的时候它会将整个List复制⼀个副本给它。
如果在读多写少这种对并发集合有利的条件下使⽤并发集合,这会⽐使⽤同步集合更具有可伸缩性。
4,什么是线程池?为什么要使⽤它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,⽽且⼀个进程能创建的线程数有限。为了避免这些
问题,在程序启动的时候就创建若⼲线程来响应处理,它们被称为线程池,⾥⾯的线程叫⼯作线程。从JDK1.5开始,JavaAPI提供了
Executor框架让你可以创建不同的线程池。⽐如单线程池,每次处理⼀个任务;数⽬固定的线程池或者是缓存线程池(⼀个适合很多⽣存期
短的任务的程序的可扩展线程池)
线程池的作⽤,就是在调⽤线程的时候初始化⼀定数量的线程,有线程过来的时候,先检测初始化的线程还有空的没有,没有就再看当
前运⾏中的线程数是不是已经达到了最⼤数,如果没有,就新分配⼀个线程去处理。