simpledateformat线程不安全原因及解决方案,simpledateformat线程安全问题
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
本教程操作环境:windows7系统、java8版、戴尔自交第三代电脑。
线程不安全验证:
/**
*简单日期格式线程安全测试
* 〈功能详细描述〉
*
* @作者17090889
* @参见[相关类/方法](可选)
* @因为[产品/模块版本] (可选)
*/
公共类SimpleDateFormatTest {
私有简单日期格式简单日期格式=新建简单日期格式( yyyy-MM-DD HH:MM:ss );
ThreadPoolExecutor池执行器=新的ThreadPoolExecutor(10,100,1,TimeUnit .分钟、new LinkedBlockingQueue(1000)、new MyThreadFactory( SimpleDateFormatTest );
公共无效测试(){
while (true) {
poolExecutor.execute(新的Runnable() {
@覆盖
公共无效运行(){
string dateString=简单日期格式。format(new Date());
尝试{
日期解析日期=简单日期格式。parse(dateString);
string datestring 2=简单日期格式。格式(解析日期);
系统。出去。println(datestring。equals(datestring 2));
} catch (ParseException e) {
e。printstacktrace();
}
}
});
}
}输出:
真实的
错误的
真实的
真实的
错误的出现了假的,说明线程不安全
1、格式方法
公共字符串缓冲器格式(日期日期,字符串缓冲区,
现场位置)
{
位置。开始索引=位置。结束索引=0;
返回格式(日期、附件、位置。getfield delegate());
}
//在创建字段委托后从格式调用
私有字符串缓冲器格式(日期日期,字符串缓冲区,
字段委托委托){
//将输入日期转换为时间字段列表
calendar.setTime(日期);
boolean useDateFormatSymbols=useDateFormatSymbols();
for(int I=0;我编译了模式。长度;) {
int tag=编译模式[I]8;
int count=编译模式[I]0x ff;
if (count==255) {
count=编译模式[I]16;
count =编译模式[I];
}
开关(标签){
案例标签_报价_ASCII_CHAR:
干杯。append((char)count);
打破;
案例标签_报价_字符:
干杯。append(编译模式,I,count);
我=计数;
打破;
默认值:
子格式(tag、count、delegate、toAppendTo、useDateFormatSymbols);
打破;
}
}
返回到toAppendTo
}受保护的日历日历;可以看到,多个线程之间共享变量日历,并修改日历。因此在多线程环境下,当多个线程同时使用相同的函数语法对象(如静电修饰)的话,如调用格式方法时,多个线程会同时调用日历。设置时间方法,导致时间被别的线程修改,因此线程是不安全的。
此外,解析方法也是线程不安全的,解析方法实际调用的是日历生成器的建立来进行解析,其方法中主要步骤不是原子操作。
解决方案:
1、将函数语法定义成局部变量
2、 加一把线程同步锁:同步(锁定)
3、使用线程本地,每个线程都拥有自己的函数语法对象副本。如:
/**
*简单日期格式线程安全测试
* 〈功能详细描述〉
*
* @作者17090889
* @参见[相关类/方法](可选)
* @因为[产品/模块版本] (可选)
*/
公共类SimpleDateFormatTest {
private static final ThreadLocalSimpleDateFormat THREAD _ LOCAL=new ThreadLocalSimpleDateFormat(){
@覆盖
受保护的简单日期格式初始值(){
返回新的简单日期格式( yyyy-MM-DD HH:MM:ss );
}
}:
//private simple date format simple date format=new simple date format( yyyy-mm-DD hh:mm:ss );
thread poolexec poolexec=新线程poolexec(10,100,1,TimeUnit).分钟,新建链接块队列(1000),新建mythtreadfactory( simpledateformattest );
公共无效测试()
while(true)}
poolexec。execute(new runnable()).
@覆盖
公共无效运行()
简单日期格式简单日期格式=线程_本地。get();
if(简单日期格式==null)}
simple date format=new simple date format( yyyy-mm-DD hh:mm:ss );
}
string datestring=simple date format。format(new date());
尝试[
日期解析日期=简单日期格式。解析(日期字符串):
string datestring 2=simple date format。格式(解析日期):
系统。出去。println(datestring。equals(datestring 2));
} catch(语法分析异常e)}
e。print stack trace();
}终于[
本地的。移除();
}
}
});
}
}
}4使用日期时间格式器-日期格式化程式代替简单日期格式-简单日期格式
日期时间格式器-日期格式化程式是线程安全的,默认提供了很多格式化方法,也可以通过of模式(模式)方法创建自定义格式化方法。
(1)格式化日期示例:
本地日期时间本地日期时间=本地日期时间。现在():
系统。出去。println(本地日期时间);-==破烂熊乐园倾情奉献==-本字幕仅供学习交流,严禁用于商业用途
datetime formatter dtf=date time formatter。of pattern( yyyy/mm/DD hh:mm:ss );
string strdate=localdatetime。格式(dtf);
系统。出去。println(strdate);//2019/23/20 15:23:46(2)解析日期
datetime formatter dtf=date time formatter。of pattern( yyyy/mm/DD hh:mm:ss );
本地日期时间本地日期时间=本地日期时间。parse( 2019/11/20 15:23:46 ,dtf);
系统。出去。println(本地日期时间);-==破烂熊乐园倾情奉献==-本字幕仅供学习交流,严禁用于商业用途相关视频教程推荐:Java视频教程以上就是简单日期格式-简单日期格式线程为什么不安全的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。