java并发小结
1.原子性,原生数据类型的一般操作都是Atomic(原子性的),除了double,long这两个类型,因为在32位的CUP的操作系统中,处理64位的数据类型不可能原子性。
另外,自增、自减运算不是原子性的,如int a =0; a++;其中a++就是非原子性的。
问:为什么要原子性?原子性的操作不存在线程安全问题……
2.可见性,可见性是指多个线程在竞争资源时,正在被某个线程使用的资源,其他线程能够看到(能够看到变化)。Volatile为关键字。(是否会引起同步问题?)
3.守护线程:又叫寄生线程,特殊的线程,主线程运行完了,守护线程生命周期结束;主线程没结束,守护线程自己运行完了生命周期结束。从寄生线程的生命周期的特征决定了它一般不能用来驱动主要的任务。
4.线程池:
1)捕获异常:下面的例子将不能捕获异常:
(1) 不加try-catch
package org.bbjava.concurrency.catching_exceptions;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExceptionThread implements Runnable {@Overridepublic void run() {throw new RuntimeException();}public static void main(String []args){ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new ExceptionThread());}} package org.bbjava.concurrency.catching_exceptions;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class NativeExceptionHandling {public static void main(String[] args) {try {ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new ExceptionThread());} catch (RuntimeException ue) {//This statement will not execute!System.out.println("Exception has been handled!");}}} package org.bbjava.concurrency.producingreturnvalue;import java.util.concurrent.Callable;public class TaskWithResult implements Callable<String> {private int id;public TaskWithResult(int id) {this.id = id;}@Overridepublic String call() throws Exception {return "result of TaskWithResult" + id;}}package org.bbjava.concurrency.producingreturnvalue;import java.util.ArrayList;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableDemo {public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool();ArrayList<Future<String>> results = new ArrayList<Future<String>>();for (int i = 0; i < 10; i++) {results.add(exec.submit(new TaskWithResult(i)));}for (Future<String> fs : results)try {System.out.println(fs.get());} catch (ExecutionException e) {System.out.println(e);return;} catch (InterruptedException e) {} finally {exec.shutdown();}}}