定时器Timer、多线程下的单例模式

在java中,Timer主要负责计划任务的功能,即在指定的时间开始执行某个任务。TimerTask是一个抽象类,负责封装定时任务。

1、定时器Timer的使用

schedule(TimerTask task, Date date):在指定的日期执行一次task。

schedule(TimerTask task, Date date, long period):在指定的日期date之后,按照period周期,无限循环执行task

TimerTask类中的cancel方法是将从任务队列中将任务自身移除。

Timer类的cancel方法是将任务队列中的全部任务进行清空,需要抢到任务队列的锁之后才能进行清理。

schedule(TimerTask task, long delay):以当前时间为基准,延迟delay的毫秒数后,执行一次task。

schedule(TimerTask task, long delay, long period):以当前时间为基准,延迟delay的毫秒数后,再以period为周期,周期性执行task。

scheduleAtFixedRate(TimerTask task, Date firstTime, long period):以firstTime为基准,以period为周期,周期性执行task。

定时器任务不一定准时执行,有可能时到达指定时间后,cpu被其他线程的同步区域占用。这时,待获得cpu执行时间片段后,才会执行定时任务。如果定时时间比当前时间早,定时任务会立即执行。

2、单例模式

volatile+double-check+延迟加载方式

java 复制代码
public class Singlton {
private volatile static Singlton instance;
private Singlton() { }
/**
* DCL双检查锁机制的延迟加载单例
* @return
*/
public static Singlton getInstance() {
if(instance!=null) {
}else{
synchronized(Singlton.class) {
if(instance==null) {
instance=new Singlton();
}
}
}
return instance;
}
}

内置类方式

java 复制代码
public class Singlton {
private static class SingltonHandler {
private static Singlton instance=new Singlton();
}
private Singlton() {}
/**
* 静态内置类实现单例模式
* @return
*/
public static Singlton getInstance() {
return SingltonHandler.instance;
}
}

内置类+序列化和反序列化方式

java 复制代码
import java.io.ObjectStreamException;
import java.io.Serializable;

public class Singlton implements Serializable{
private static final long serialVersionUID = -7197411174599222772L;

private static class SingltonHandler {
private static Singlton instance=new Singlton();
}
private Singlton() {}
/**
* 静态内置类实现单例模式
* @return
*/
public static Singlton getInstance() {
return SingltonHandler.instance;
}
/*
* 保证了单例模式下,单态对象序列化和反序列化之后仍然维持一致
*/
protected Object readResolve() throws ObjectStreamException{
return SingltonHandler.instance;
}
}

静态块方式

java 复制代码
public class Singlton {
private static Singlton instance;
private Singlton() {}
static {
instance=new Singlton();
}
/**
* 静态代码块实现单例模式
* @return
*/
public static Singlton getInstance() {
return instance;
}


}

枚举方式

java 复制代码
//枚举类型本身是final的,不允许被继承
public enum Singlton {
INSTANCE;
Singlton() {}
/**
* 枚举类型的实现
* @return
*/
public static Singlton getInstance() {
return INSTANCE;
}


}

延迟加载+枚举内置方式

java 复制代码
public class Singlton {
private Singlton() {}
private enum EnumHolder{
INSTANCE;
private Singlton singlton;
EnumHolder(){
this.singlton=new Singlton();
}
private Singlton getSinglton() {
return this.singlton;
}
}
/**
* 枚举类型的实现
* @return
*/
public static Singlton getInstance() {
return EnumHolder.INSTANCE.getSinglton();
}

}
相关推荐
_冷眸_7 分钟前
Python 调用大模型 API:最小请求、Base URL 和 401/404 排查
开发语言·人工智能·python
niucloud-admin18 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:服务保障
java·开发语言·php
IT枫斗者枫哥31 分钟前
CompletableFuture失败后返回空列表:异常没了,业务含义也变了
java·后端
知识搬运临时工42 分钟前
一个模板把 AEM 拖进 Full GC 死亡螺旋:300% CPU、7 GB 堆、310 万行堆栈
java·aws
熊猫钓鱼>_>1 小时前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc
用户432935928051 小时前
CoAP还是MQTT:1万只Cat.1水表三个月带宽续航实测
java
知守观1 小时前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
Ai-_Man1 小时前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
raindayinrain1 小时前
c++设计模式
开发语言·c++·设计模式
Java成神之路-1 小时前
Java String 为什么不可变?和 HashMap 到底有什么关系?
java