在我们想要谈论Java并发包(java.util.concurrent)的时候,这是一个头疼的问题,却又是每个Java工程师不得不掌握的一项技能。一直以来都想写一个Java并发包系列,无奈迟迟没有动手动脑。最近重新思考规划了自己的学习路线,决定从Java并发包开始把每个技术、原理、源码做成一个一个系列,由浅入深,由表及里。
这是Java并发包的开篇,我讲大致介绍一个较为宏观的角度来窥探Java并发包,以及这个系列的一些大致思路。
java.uti.concurrent从jdk1.5开始新加入的一个包,致力于解决并发编程的线程安全问题,使用户能够更为快捷方便的编写多线程情况下的并发程序。谈到线程安全问题总会免不了几个核心问题:锁、阻塞、原子性、可见性等等。
-java.util.concurrent
-atomic
-locks
…
在concurrent包下还有两个子包,一个是atomic这里面放置的是一些原子类,比如在多线程环境下执行i++的操作,实际上是i+1再是将结果赋值给i,这里就会涉及到一个线程安全的问题,当一个线程正在执行i+1的时候,很有可能另外一个线程正在读取i的值,这个时候就会造成数据不一致,这是原子性的问题。即使一个线程完成了i++的操作,而另外一个线程此时来读取i的值也有可能发现i并不是相加后的值,这是可见性的问题。atomic里的AtomInteger就能完美解决原子性和可见性的问题。
另一个包是locks,这里面的包可以说是提供了并发包里线程安全的最为基础的工具-显示锁(ReentrantLock、ReadWriteLock)。Java中有synchronized修饰的同步代码块内置锁,但这远远不能满足一些高级特性,例如通过轮询、定时的方式去获得一个锁,并发包的显示锁的灵活性要高于synchronized,但随之而来的是使用的难度会增加,使用不当则会造成未知的后果。
concurrent包下就是一些并发工具包,常见的有ConcurrentHashMap、ArrayLinkedQueue、LinkedBlockingQueue...这些都是线程安全的类,根据情况不同选取不同的类。
在这个系列的开始,我会首先介绍有关线程的一些基础知识以及专业术语,例如:线程与进程、阻塞与非阻塞、线程安全、原子性、可见性等等,有时候可能会“超纲”,超纲部分做简单简述。接着会从实例出发分门别类的介绍并发包以及源码,源码以jdk1.7为主,又是可能会设自己最新的jdk1.8甚至jdk1.6,这会特殊表明。最后会对Java并发包做一个总结性的概述。