您的位置:首页 > 编程语言 > Java开发

Java多线程总结

2015-07-31 16:30 435 查看

1.线程是什么,线程与进程的区别

1.1 线程的概念

一段程序执行流。

1.2 线程中的一些术语

线程安全:多个线程访问同一个类,它始终表现正确的行为

线程同步:线程的执行需要加锁

线程封闭:

内置锁/互斥锁:JVM提供的隐形锁,当使用synchronized修饰方法或者同步块时,进入时获取对象锁,出来时释放对象锁。

内存可见性:一个线程对状态的改变,其他线程都可以看见,例如:volatile修饰变量

原子性:在执行一个操作时,中间不会被其他线程抢占,例如:synchronized修饰方法

原子变量:AtomicLong,保证单个可变的状态的原子性。

CAS:compare and swap,硬件实现。

竞态条件:程序的执行结果与线程的交替执行顺序有关。

fast-fail:当有多个线程访问同一个容器,如果至少有一个对他修改,会抛出异常。例如:HashMap,ArrayLIst,Vector。

复合操作:一个操作包含几个细小的操作,例如:若队列为空,线程阻塞。

线程阻塞:线程在等待其他事件,例如:锁,IO结束。

1.3 线程与进程的区别

a.一个进程至少有一个主线程,也可以有多个线程;

b.线程是CPU分配和调度的基本单元,进程是资源分配的基本单元;

c.创建线程的消耗比创建进程小;

d.线程之间共享同一个进程的资源,进程独享自己的资源;

2 .线程的创建

2.1 继承Thread类

class A extends Thread{}

缺点:Java中类只能单继承,无法再继承其他类

2.2 实现Runnable接口

class A implements Runnable{}

注意:必须实现run方法

2.3 实现Callable接口

class A implements Callabke{}

注意:必须实现call方法

与Runnable的区别在于一个有返回值,可以抛异常;另一个没有返回值

3 线程安全

3.1 为什么会出现线程安全问题

多个线程同时访问一个类,至少有一个执行写操作,却没有加锁。

3.2 怎么解决线程安全问题

3.2.1 不可变

String,不可变对象始终是线程安全的。



3.2.2 不共享

将对象封闭在线程中,不与其他线程共享。



3.2.3 加锁

将需要共享的可变状态封闭在对象中,所有对状态的操作设置在方法上,并且对方法的访问全部加锁。

锁独占:内置锁/互斥锁

锁分段:ConcurrentHashMap

可中断锁:ReentrantLock

4 线程的调度

4.1 线程优先级

给每个线程一个标记,

5 线程池

5.1 线程池概念以及组成

在程序启动时,就先创建好一些线程,等待请求到来,直接使用。

组成:核心线程池,任务队列



5.2 线程池原理

核心线程池是否满了,若未满,先创建线程;若满了,将来不及处理的任务放入任务队列,当队列满了之后,还可以创建线程,直到线程池满。



5.3 创建线程池

Executors工具类的一些方法,newCachedThreadPool(),newFixedThreadPool();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: