【JAVA SE基础篇】61.多线程相关1

1.任务定时调度

通过Timer和Timetask,我们可以实现定时启动某个线程。

java.util.Timer:类似闹钟的功能,本身实现的就是一个线程

java.util.TImerTask:一个抽象类,该类实现了Runnable接口,所以该类具备了多线程的能力

2.QUARTZ

任务调度框架:

Scheduler:调度器,控制所有的调度

Trigger:触发条件

JobDetail:需要处理JOB

Job:执行逻辑

3.指令重排(HappenBefore)

执行代码的顺序可能与编写代码不一致,即虚拟机优化代码顺序,则为指令重排

数据依赖:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖。

存在数据依赖的两个操作重排,则会影响执行结果。所以编译器和处理器在重排时,会遵守数据依赖性,

编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序

4.volatile

volatile保证线程间变量的可见性,简单地说就是当线程A对变量X进行了修改之后,在线程A后面执行的其他线程能看到变量X的变动,更详细地说时要符合以下两个规则:

线程对变量进行修改后,要立刻回写到主内存

线程对变量读取的时候,要从主内存中读,而不是缓存

注:各线程的工作内存间彼此独立,互不可见,在线程启动的时候,虚拟机为每个内存分配一块工作内存,不仅包含了线程内部定义的局部变量

也包含了线程所需要使用的共享变量(非线程内构造的对象)的副本,即为了提高执行效率

volatile是不错的机制,但是volatile不保证原子性。

5.单例模式

DCL单例模式:在多线程环境下对外存在一个对象

1.构造器私有化,避免外部new构造器

2.提供私有的静态属性,存储对象的地址

3.提供公共的静态方法,获取属性

原文地址:https://www.cnblogs.com/chengkuan/p/13384839.html