当前位置: 首页 > news >正文

网站开发职业规划字体设计海报

网站开发职业规划,字体设计海报,天津seo关键字推广,网站栏目规划注意事项一#xff1a;概述 SimpleDateFormat 类主要负责日期的转换与格式化等操作#xff0c;在多线程的环境中#xff0c;使用此类容易造成数据转换及处理的不正确#xff0c;因为 SimpleDateFormat 类并不是线程安全的#xff0c;但在单线程环境下是没有问题的。 SimpleDateF…一概述 SimpleDateFormat 类主要负责日期的转换与格式化等操作在多线程的环境中使用此类容易造成数据转换及处理的不正确因为 SimpleDateFormat 类并不是线程安全的但在单线程环境下是没有问题的。 SimpleDateFormat 在类注释中也提醒大家不适用于多线程场景 说的很清楚SimpleDateFormat 不是线程安全的多线程下需要为每个线程创建不同的实例。 不安全的原因是因为使用了 Calendar 这个全局变量 在日期格式化的时候 二线程不安全的原因 我们把重点放在 calendar 这个 format 方法在执行过程中会操作成员变量 calendar 来保存时间 calendar.setTime(date) 。 但由于在声明 SimpleDateFormat 的时候使用的是 static 定义的那么这个 SimpleDateFormat 就是一个共享变量SimpleDateFormat 中的 calendar 也就可以被多个线程访问到所以问题就出现了举个例子 假设线程 A 刚执行完 calendar.setTime(date) 语句把时间设置为 2020-09-01但线程还没执行完线程 B 又执行了 calendar.setTime(date) 语句把时间设置为 2020-09-02这个时候就出现幻读了线程 A 继续执行下去的时候拿到的 calendar.getTime 得到的时间就是线程B改过之后的。 除了 format() 方法以外SimpleDateFormat 的 parse 方法也有同样的问题。 至此我们发现了 SimpleDateFormat 的弊端所以为了解决这个问题就是不要把 SimpleDateFormat 当做一个共享变量来使用 阿里巴巴 java 开发规范是怎么描述 SimpleDateFormat 的 三、模拟线程安全问题 无码无真相接下来我们创建一个线程来模拟 SimpleDateFormat 线程安全问题 创建 TestThread.java 类 结果 从控制台打印的结果来看使用单例的 SimpleDateFormat 类在多线程的环境中处理日期转换极易出现转换异常java.lang.NumberFormatException:multiple points以及转换错误的情况。 代码 public class TestThread extends Thread {private SimpleDateFormat simpleDateFormat;// 要转换的日期字符串private String dateString;public TestThread(SimpleDateFormat simpleDateFormat, String dateString) {this.simpleDateFormat simpleDateFormat;this.dateString dateString;}Overridepublic void run() {try {Date date simpleDateFormat.parse(dateString);String newDate simpleDateFormat.format(date).toString();if (!newDate.equals(dateString)) {System.out.println(ThreadName this.getName() 报错了日期字符串 dateString 转换成的日期为 newDate);}} catch (ParseException e) {e.printStackTrace();}} }// 一般我们使用SimpleDateFormat的时候会把它定义为一个静态变量避免频繁创建它的对象实例private static SimpleDateFormat simpleDateFormat new SimpleDateFormat(YYYY-MM-dd);public static void main(String[] args) {String[] dateStringArray new String[]{2021-03-10, 2021-05-1, 2021-05-19, 2021-09-17};TestThread[] threads new TestThread[4];// 创建线程for (int i 0; i 4; i) {threads[i] new TestThread(simpleDateFormat, dateStringArray[i]);}// 启动线程for (int i 0; i 4; i) {threads[i].start();}} 五、如何解决线程安全 1、每次使用就创建一个新的 SimpleDateFormat 创建全局工具类 DateUtils.java public class DateUtils {public static Date parse(String formatPattern, String dateString) throws ParseException {return new SimpleDateFormat(formatPattern).parse(dateString);}public static String format(String formatPattern, Date date){return new SimpleDateFormat(formatPattern).format(date);} }2加synchronized 锁 简单粗暴synchronized 往上一套也可以解决线程安全问题缺点自然就是并发量大的时候会对性能有影响因为使用了 synchronized 加锁后的多线程就相当于串行线程阻塞执行效率低 public class DateUtilsSynchronized {private static final SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);public static Date parse(String formatPattern, String dateString) throws ParseException {synchronized (simpleDateFormat){return simpleDateFormat.parse(dateString);}}public static String format(String formatPattern, Date date) {synchronized (simpleDateFormat){return simpleDateFormat.format(date);}} }3、使用ThreadLocal ThreadLocal 是 java 里一种特殊的变量ThreadLocal 提供了线程本地的实例它与普通变量的区别在于每个使用该线程变量的线程都会初始化一个完全独立的实例副本。 hreadLocal 可以确保每个线程都可以得到单独的一个 SimpleDateFormat 的对象那么就不会存在竞争问题。 public class DateUtilsThreadLocal {private static ThreadLocalDateFormat threadLocal new ThreadLocalDateFormat() {Overrideprotected DateFormat initialValue() {return new SimpleDateFormat(yyyy-MM-dd);}};public static Date parse(String formatPattern, String dateString) throws ParseException {return threadLocal.get().parse(dateString);}public static String format(String formatPattern, Date date) {return threadLocal.get().format(date);} }4:推荐写法  上边提到的阿里巴巴 java 开发手册给出了说明如果是 JDK8 的应用可以使用 Instant 代替 DateLocalDateTime 代替 CalendarDateTimeFormatter 代替 SimpleDateFormat官方给出的解释simple beautiful strong immutable thread-safe。 日期转换SimpleDateFormat 固然好用但是现在我们已经有了更好地选择Java 8 引入了新的日期时间 API并引入了线程安全的日期类一起来看看。 Instant瞬时实例。 LocalDate本地日期不包含具体时间 例如2014-01-14 可以用来记录生日、纪念日、加盟日等。 LocalTime本地时间不包含日期。 LocalDateTime组合了日期和时间但不包含时差和时区信息。 ZonedDateTime最完整的日期时间包含时区和相对UTC或格林威治的时差。 新API还引入了 ZoneOffSet 和 ZoneId 类使得解决时区问题更为简便。 解析、格式化时间的 DateTimeFormatter 类也进行了全部重新设计。 例如我们使用 LocalDate 代替 Date使用 DateTimeFormatter 代替 SimpleDateFormat如下所示: String DateNow LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyy/MM/dd HH:mm:ss));System.out.println(DateNow); 这样就避免了 SimpleDateFormat 的线程不安全问题啦。
http://www.zqtcl.cn/news/987095/

相关文章:

  • 建筑钢结构网站汉阳网站建设哪家便宜
  • 营销型网站建设评价临湘网站建设
  • 做网站的价格参考巴中建网站的公司
  • 张家口建设网站网络技术工程师
  • 大型网站后台登录地址一般是如何设置的哪里网站用vue.js做的
  • 网页设计规范图标设计百度seo优化多少钱
  • 网站打开速度概念建筑网站知乎
  • 网站的flash怎么做的杭州市城乡建设网官网
  • 宿迁网站建设排名wordpress多站点可视化
  • 苏州好的做网站的公司哪家好前端如何做响应式网站
  • 广州网站建设招标推广方式有哪些渠道
  • 郑州做网站狼牙东莞建设造价信息网站
  • 网站制作代理加盟国内seo服务商
  • 如何在建设银行网站预约纪念币网络销售好不好做
  • 利用淘宝视频服务做视频网站聊城做网站价格
  • 做美容行业的网站哪个好广西互联网企业
  • 做网站平台的营业执照江镇做包子网站
  • 网站建设 摄影服务wordpress破解模板
  • 网站规划中的三种常用类型宁波海曙区建设局网站
  • dede做网站湖北网址大全
  • 如何注册网站的名字html表单制作
  • 中国建设工程协会标准网站什么网站做推广比较好
  • 长沙专业网站建设怎么做关于网站建设的投标书
  • 石家庄公司网站如何制作wordpress 大图 主题
  • 网站建设和管理情况如何传图片做网站
  • 网站建设流量什么意思杭州企业网站设计模板
  • 义乌网站制作是什么交互式网站
  • 淘宝客api调用到网站世界足球排名前100名
  • 网站建设合作方案wordpress 付费主题 高级功能编辑器
  • 用cms做网站的具体步骤北京市网站备案查询