Java的多线程

Java的多线程

八月 03, 2019

Java的多线程

1、多线程的两种创建方式

java.lang.Thread类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程
类本身就是调用的Runnable接口所以你可以继承java.lang.Thread类或者直接实现Runnable接口来重
写run()方法实现线程。

2、在Java中 wait 和 sleep 方法的不同

最大的不同是在等待时wait会释放锁,而sleep一直持有锁,wait通常被用于线程间交互,sleep通常被
用于暂停执行。

3、synchronized 和 volatile 关键字的作用

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

1> 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对对其他
线程来说是立即可见的。

2>禁止进行指令重排序
volatile 本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

1、volatile 仅能使用在变量级别;
synchronized 则可以使用在变量、方法和类级别的

2、volatile 仅能实现变量的修改可见性,并不能保证原子性;
synchronized 则可以保证变量的修改可见性和原子性

3、volatile 不会造成线程的阻塞;
synchronized 可能会造成线程的阻塞

4、volatile 标记的变量不会被编译器优化;
synchronized 标记的变量可以被编译器优化