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

java多线程知识点整理

2016-10-23 12:02 435 查看

java多线程知识点整理

State枚举类





下面详细说明一下线程各状态表示的意思:

NEW:至今尚未启动的线程处于该状态,通俗来讲,该状态是线程实例化后还从未执行start()方法的状态;

RUNNABLE:正在java虚拟机中执行的线程处于这种状态;

BLOCKED:受阻塞并等待某个监视器锁的线程处于这种状态;

WAITING:无限期地等待另一个线程来执行某一特定操作的线程处于这种状态;

TIMED_WAITING:等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态;

TERMINATED:已退出的线程处于这种状态,线程被销毁。

下面是方法与线程状态关系示意图



在调用与线程相关的方法后,会进入不同的状态。

锁对象的队列

每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列,就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,当一个被线程被唤醒 (notify)后,才会进入到就绪队列,等待获得锁。

如果不使用notify 那么阻塞队列里的线程将一直处于阻塞状态,即使就绪队列里的线程都执行完了,阻塞队列里的线程也将一直处于阻塞状态。

synchronized与volatile

synchronized关键字加到static静态方法上是给class类上锁,也就是多线程访问该class加载的任何实例的synchronized方法都会有阻塞问题;而加到非static静态方法上是给对象上锁,也就是不同对象,同一时刻可以访问同一个syncronized方法或其他syncronized方法,两个对象之间并不产生互斥关系。

volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。如果不加volatile修饰实例变量,则它是从线程私有数据栈中取值。

二者比较:

volatile是线程安全的轻量级实现,所以volatile性能肯定比synchronized要好,且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。

多线程访问volatile不会发生阻塞,而synchronized会发生阻塞。

volatile能保证数据可见性,但不能保证原子性(不可分割,不能有其余线程插入);而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。

volatile解决的是变量在多个线程之间的可见性;而synchronized解决的是多个线程之间访问资源的同步性。

原子操作是不能分割的整体,没有其他线程能够中断或检查正在进行原子操作中的变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 volatile