simpledateformat线程不安全原因及解决方案,simpledateformat线程安全问题

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: