并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善。现代的PC都有多个CPU或一个CPU中有多个核,是否能合理运用多核的能力将成为一个大规模应用程序的关键。 Java基础部分 ...
并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善。现代的PC都有多个CPU或一个CPU中有多个核,是否能合理运用多核的能力将成为一个大规模应用程序的关键。
Java基础部分知识总结点击Java并发基础总结。Java多线程相关类的实现都在Java的并发包concurrent,concurrent包主要包含3部分内容,第一个是atomic包,里面主要是一些原子类,比如AtomicInteger、AtomicIntegerArray等;第二个是locks包,里面主要是锁相关的类,比如ReentrantLock、Condition等;第三个就是属于concurrent包的内容,主要包括线程池相关类(Executors)、阻塞集合类(BlockingQueue)、并发Map类(ConcurrentHashMap)、线程相关类(Thread、Runnable、Callable)等。
atomic包源码分析
atomic包是专门为线程安全设计的Java包,包含多个原子操作类。其基本思想就是在多线程环境下,当有多个线程同时执行这些类的实例的方法时,具有排他性,一个线程进入方法执行指令时,不会被其他的线程打断,而别的线程就像自旋锁一样,一直等待该方法执行完成。
原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。
atomic包一共有12个类,四种原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新字段。JDK1.5中引入了底层的支持,在int、long和对象的引用等类型上都公开了CAS的操作,并且JVM把它们编译为底层硬件提供的最有效的方法,在运行CAS的平台上,运行时把它们编译为相应的机器指令。在java.util.concurrent.atomic包下面的所有的原子变量类型中,比如AtomicInteger,都使用了这些底层的JVM支持为数字类型的引用类型提供一种高效的CAS操作。
Unsafe中的操作一般都是基于CAS来实现的,CAS就是Compare and Swap的意思,比较并操作。很多的cpu直接支持CAS指令。CAS是一项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
/** * AtomicMain * atomic class test */public class AtomicMain { public static void main(String[] args) throws InterruptedException { ExecutorService executor = Executors.newCachedThreadPool(); AtomicInteger data = new AtomicInteger(0); AtomicIntegerArray array = new AtomicIntegerArray(10); AtomicReference reference = new AtomicReference(); /* AtomicInteger测试 */ executor.execute(new AtomicIntegerTask(data)); executor.execute(new AtomicIntegerTask(data)); /* AtomicIntegerArray测试 */ executor.execute(new AtomicIntegerArrayTask(array)); executor.execute(new AtomicIntegerArrayTask(array)); User user = new User("xxx", 18); reference.set(user); executor.execute(new AtomicReferenceTask(reference)); /** * shutdown表示线程池不再接收新的任务了, * 而不是阻塞到线程池任务执行完成之后再返回 */ executor.shutdown(); /* 延时保证线程池任务执行完毕 */ Thread.sleep(100); System.out.println(data); for (int i = 0; i < 10; i++) { System.out.print(array.get(i) + " "); } System.out.println(); System.out.println(user); } /** * AtomicInteger */ static class AtomicIntegerTask implements Runnable { private AtomicInteger data; public AtomicIntegerTask(AtomicInteger data) { this.data = data; } public void run() { int cnt = 10; while (cnt-- > 0) { data.incrementAndGet(); } } } /** * 传进来的Array大小至少为10 * AtomicIntegerArray是原子性的,保证对该array整个内存操作的原子性, * 也就是说不可能同时有A线程对array[0]操作,而B线程对array[1]操作 */ static class AtomicIntegerArrayTask implements Runnable { private AtomicIntegerArray array; public AtomicIntegerArrayTask(AtomicIntegerArray array) { this.array = array; } public void run() { int cnt = 10; while (cnt-- > 0) { for (int i = 0; i < 10; i++) { array.getAndAdd(i, 1); } } } } static class AtomicReferenceTask implements Runnable { private AtomicReference reference; public AtomicReferenceTask(AtomicReference reference) { this.reference = reference; } public void run() { reference.set(new User("luoxn28", 23)); } } static class User { public String name; public int age; public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }}
原标题:Java并发包源码分析
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。