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.提供公共的静态方法,获取属性