Java线程的实现方式
- 继承Thread类,实现run方法。
- 实现Runnable接口,实现run方法。
- 实现Callable 重写call方法。
- 使用线程池创建。
共同点:底层均为实现Runnable接口。
Java线程中的状态
- 新建(刚创建出来,还没有执行start方法)
- 就绪(执行start方法后)
- 等待(执行wait后)
- 时间等待(执行sleep、join后)
- 阻塞(获取锁失败后)
- 结束(run方法执行完之后)
Java线程停止方法
- 调用线程的stop方法。
- 使用共享变量配合while控制。
- 调用线程 interrupt方法。
Java中sleep和wait区别
- sleep属于Thread类中的static方法、wait属于Object类的方法
- sleep属于TIMED_WAITING,自动被唤醒、wait属于WAITING,需要手动唤醒。
- sleep方法在持有锁时,执行,不会释放锁资源、wait在执行后,会释放锁资源。
- sleep可以在持有锁或者不持有锁时,执行。 wait方法必须在只有锁时才可以执行。
Java并发编程三大特性
- 原子性
一个操作是完整连续的,不可被中断的。一个线程在执行时,另一个线程不会影响到它。 - 可见性
多核cpu同时加载某个值时,其中一个核心在缓存中修改了该值,对其他核心也可见。
可以使用volatile关键字标注属性。被该关键字标注后的属性,读取时会禁止写入到缓存之中,修改时也会直接修改内存中的值。实现了可见性。 - 有序性
在执行前需要再次转为CPU可以识别的指令,CPU在执行这些指令时,为了提升执行效率,在不影响最终结果的前提下(满足一些要求),会对指令进行重排。
三种不会重排序的方式:- as-if-serial语义:
不论指定如何重排序,需要保证单线程的程序执行结果是不变的。
而且如果存在依赖的关系,那么也不可以做指令重排。 - happens-before。
- volatile关键字。
- as-if-serial语义: