1.多线程博客学习

1.

JDK 5.0 起提供了线程池相关API:ExecutorService 和 Executors
ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor.
void execute(Runnable coommand):执行任务/命令,没有返回值,一般用来执行Runnable
Future submit(Callable task):执行任务,有返回值,一般又来执行Callable
void shutdown():关闭连接池。

2.Thread和Runnable在java.lang包下,Thread类是Runnable接口的实现类,Callable接口在java.util.concurrent包下

3.线程池:Executor---ExecutorService---AbstractExecutorService---ThreadPoolExecutor

Matrix海子博客

1.线程进程区别

2.如何创建线程

(1)让多个线程执行一个任务;让一个线程执行一个子任务

  1.继承Thread类

  继承Thread类的话,必须重写run方法,在run方法中定义需要执行的任务。

创建任务的同时创建线程

  2.实现Runnable接口

创建任务和创建线程分离

Runnable的中文意思就是:任务

  3.Runtime,顾名思义,即运行时,表示当前进程所在的虚拟机实例。

3.Thread类的使用

join方法内部调用的是wait方法,所以也会释放锁

4.synchronized

从反编译获得的字节码可以看出,synchronized代码块实际上多了monitorenter和monitorexit两条指令

对于synchronized方法,执行中的线程识别该方法的 method_info 结构是否有 ACC_SYNCHRONIZED 标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。

有一点要注意:对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象

5.Lock

也就是说Lock提供了比synchronized更多的功能

(1)Lock是一个接口,在java.util.concurrent.locks包下。ReentrantLock实现了Lock接口

(2)ReadWriteLock

读写锁

  读写锁将对一个资源(比如文件)的访问分成了2个锁,一个读锁和一个写锁

正因为有了读写锁,才使得多个线程之间的读操作不会发生冲突。

个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作

ReentrantReadWriteLock实现了ReadWriteLock接口。

6.volatile关键字解析

(1)java内存模型

(2)volatile的作用:保证内存可见性,禁止指令重排序

7.ThreadLocal

ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量

最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等

8.同步容器

(1)在Collections类中提供了大量的方法,比如对集合或者容器进行排序、查找等操作。最重要的是,在它里面提供了几个静态工厂方法来创建同步容器类

9.CopyOnWrite

CopyOnWrite容器即写时复制的容器

(1)从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet

(2)通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

(3)CopyOnWrite并发容器用于读多写少的并发场景

10.并发容器

(1)ConcurrentHashMap代替同步的Map

(2)CopyOnWriteArrayList和CopyOnWriteArraySet分别代替List和Set,迭代过程要保证不出错,除了加锁,另外一种方法就是"克隆"容器对象。

11.阻塞队列

12.Future

(1)RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口

13.面试题

(1)有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类

(2) 在多线程中,什么是上下文切换(context-switching)?

上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行

14.如何确保线程安全?

在Java中可以有很多方法来保证线程安全——同步,使用原子类(atomic concurrent classes),实现并发锁,使用volatile关键字,使用不变类和线程安全类。在线程安全教程中,你可以学到更多。

原文地址:https://www.cnblogs.com/midiyu/p/15256374.html