- 浏览: 378742 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
u014689192:
很不错
JMX学习笔记(三)-MXBean -
focus2008:
进制转换之后,根本不会执行js代码,感觉你没有测试过吧
xss漏洞之进制转换 -
focus2008:
如何使用过滤器来处理呢?
xss漏洞之进制转换 -
1169158401:
我艹,我那天这么写,包括一些方法,然后那货说这样写不容易看懂。 ...
import static简化代码 -
AquariusM:
奢华的JVM介绍!
JMX学习笔记(三)-MXBean
以前写过一篇 , 《SimpleDateFormat性能调优》http://tuhaitao.iteye.com/admin/blogs/822277
虽然可以解决SimpleDateFormat的线程安全问题,但不能够灵活的配置日期Parten,为了使其能够灵活的配置日期格式,我进行了一番改造。
1. 通过配置文件加载Praten,灵活配置日期格式
2. 使用FastHashMap结合ThreadLocal,解决多个日期格式的线程安全问题
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.opencfg.core; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.commons.collections.FastHashMap; import org.apache.commons.lang.StringUtils; /** * <p> * DateFormat Utils * <p> * * <p>#ThreadSafe#</p> * * @author Opencfg Software Foundation * @since 0.0.1-SNAPSHOT * @version $Id: DateFormatUtils.java 2011-06-14 23:21:53 reymondtu $ */ public class DateFormatUtils { private static final FastHashMap datePartenMap = new FastHashMap(); static { // load data parten properties files List<String> propList = PropertiesUtils.getSimpleList("DateFormatUtils.properties") ; datePartenMap.setFast(true); for(String dateParten : propList) { if(StringUtils.startsWith(dateParten, "#")) continue; datePartenMap.put(StringUtils.trim(dateParten), new SimpleDateFormat(dateParten)); } } /** * String -> Date * * @param dateParten Parse Date Parten * @param dateStr Parse Date String * @throws ParseException */ public static Date safeParseDate(final String dateParten, final String dateStr) throws ParseException { return getFormat(dateParten).parse(dateStr); } /** * Date -> String * * @param dateParten Format Date Parten * @param date Format java.util.Date Object */ public static String safeFormatDate(final String dateParten, final Date date) { return getFormat(dateParten).format(date); } private static ThreadLocal<FastHashMap> threadLocal = new ThreadLocal<FastHashMap>(){ protected synchronized FastHashMap initialValue() { return (FastHashMap)datePartenMap.clone(); } }; private static DateFormat getFormat(final String dateParten){ return (DateFormat)threadLocal.get().get(dateParten); } }
这里使用了apache commons-collections里的FashHashMap类,此类适用于读多写少的高并发操作,很适合写缓存.
下边是读取配置文件的类:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.opencfg.core; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy; import org.apache.commons.lang.StringUtils; /** * <p> * Properties Utils * <p> * * <p>#ThreadSafe#</p> * * @author Opencfg Software Foundation * @since 0.0.1-SNAPSHOT * @version $Id: PropertiesUtils.java 2011-06-15 01:22:53 reymondtu $ */ public class PropertiesUtils { /** * Load Properties File * @throws ConfigurationException */ public static PropertiesConfiguration loadClassPathProperties(final String fileName, final long refreshInterval) throws ConfigurationException { URL url = PropertiesUtils.class.getClassLoader().getResource(fileName); File f = new File(url.getFile()); if(!f.exists()) { throw new IllegalArgumentException("can not load file " + fileName); } PropertiesConfiguration prop = new PropertiesConfiguration(url.getFile()); FileChangedReloadingStrategy fcrs = null; fcrs = new FileChangedReloadingStrategy(); fcrs.setRefreshDelay(refreshInterval); prop.setReloadingStrategy(fcrs); return prop; } public static List<String> getSimpleList(final String fileName) { try { PropertiesConfiguration prop = loadClassPathProperties(fileName, 500); BufferedReader reader = new BufferedReader(new FileReader(prop.getFile())); List<String> list = new ArrayList<String>(); String line = null; while ((line =reader.readLine())!= null) { if(StringUtils.startsWith(line, "#")) { continue; } list.add(line); line = reader.readLine(); } return list; } catch (Exception e) { throw new IllegalArgumentException("can not load file " + fileName); } } }
配置文件DateFormatUtils.properties如下:
#show all yyyy-MM-dd HH:mm:ss yyyy年MM月dd日 HH:mm:ss yyyy年MM月dd日 HH时mm分ss秒 #only show date yyyy-MM-dd yyyy年MM月dd日 #only show hour,minute,second HH:mm:ss HH时mm分ss秒
这里我跟传统的SimpleDateFormat,apache 的 FastDateForma, DateUtilst做了性能对比:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.opencfg.core; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang.time.FastDateFormat; import org.junit.Before; import org.junit.Test; /** * DateFormatUtils JUnit4 Test * * @author Opencfg Software Foundation * @since 0.0.1-SNAPSHOT * @version $Id: DateFormatUtilsTest.java 2011-06-15 00:36:53 reymondtu $ */ public class DateFormatUtilsTest { private final int TEST_SIZE = 1000000; private Date[] dateArray = new Date[TEST_SIZE]; private String[] stringArray = new String[TEST_SIZE]; @Before public void setUp() { for(int i = 0; i < TEST_SIZE; i++) { dateArray[i] = new Date(); } for(int i = 0; i < TEST_SIZE; i++) { stringArray[i] = DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", new Date()); } } /* Format */ @Test public void test_JDK_SimpleDateFormat_format() { long starttime = System.currentTimeMillis(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for(Date date : dateArray) { sdf.format(date); } long endtime = System.currentTimeMillis(); System.out.println("JDK SimpleDateFormat format cost:" + (endtime - starttime) + "ms"); } @Test public void test_Opencfg_DateFormatUtils_format() { long starttime = System.currentTimeMillis(); for(Date date : dateArray) { DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", date); } long endtime = System.currentTimeMillis(); System.out.println("Opencfg DateFormatUtils format cost:" + (endtime - starttime) + "ms"); } @Test public void test_Apache_FastDateFormat_format() { FastDateFormat fastDateFormat = FastDateFormat.getInstance(); long starttime = System.currentTimeMillis(); for(Date date : dateArray) { fastDateFormat.format(date); } long endtime = System.currentTimeMillis(); System.out.println("Apache FastDateFormat format cost:" + (endtime - starttime) + "ms"); } /* Parse */ @Test public void test_JDK_SimpleDateFormat_parse() throws ParseException { long starttime = System.currentTimeMillis(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for(String str : stringArray) { sdf.parse(str); } long endtime = System.currentTimeMillis(); System.out.println("JDK SimpleDateFormat parse cost:" + (endtime - starttime) + "ms"); } @Test public void test_Opencfg_DateFormatUtils_parse() throws ParseException { long starttime = System.currentTimeMillis(); for(String str : stringArray) { DateFormatUtils.safeParseDate("yyyy-MM-dd HH:mm:ss", str); } long endtime = System.currentTimeMillis(); System.out.println("Opencfg DateFormatUtils parse cost:" + (endtime - starttime) + "ms"); } @Test public void test_Apache_DateUtils_parse() throws ParseException { long starttime = System.currentTimeMillis(); String[] dateParten = new String[]{"yyyy-MM-dd HH:mm:ss"}; for(String str : stringArray) { org.apache.commons.lang.time.DateUtils.parseDate(str, dateParten); } long endtime = System.currentTimeMillis(); System.out.println("Apache DateUtils parse cost:" + (endtime - starttime) + "ms"); } }
这里分别用100W个string数组 与100W个Date数组做了实验,结果如下
JDK SimpleDateFormat format cost:1313ms Opencfg DateFormatUtils format cost:844ms Apache FastDateFormat format cost:1860ms
JDK SimpleDateFormat parse cost:3563ms Opencfg DateFormatUtils parse cost:3641ms Apache DateUtils parse cost:16656ms
在单线程测试中,Opencfg DateFormatUtils的format能力 明显高于JDK 40%、Aapache 50%, parse的能力与单线成下的SimpleDateFormat相当, 与Apache的DateUtils明显不在一个级别,性能高出500%。
下边我使用多线程测试:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.opencfg.core; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang.time.FastDateFormat; import org.junit.Before; import org.junit.Test; /** * DateFormatUtils JUnit4 Test * * @author Opencfg Software Foundation * @since 0.0.1-SNAPSHOT * @version $Id: DateFormatUtilsMutiThreadTest.java 2011-07-18 23:06:53 reymondtu $ */ public class DateFormatUtilsMutiThreadTest { private final int TEST_SIZE = 1000000; private final int TEST_THREAD_COUNT = 10; private Date[] dateArray = new Date[TEST_SIZE]; private String[] stringArray = new String[TEST_SIZE]; @Before public void setUp() { for(int i = 0; i < TEST_SIZE; i++) { dateArray[i] = new Date(); } for(int i = 0; i < TEST_SIZE; i++) { stringArray[i] = DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", new Date()); } } /* Format */ @Test public void test_Apache_FastDateFormat_format() throws InterruptedException { final FastDateFormat fastDateFormat = FastDateFormat.getInstance(); long starttime = System.currentTimeMillis(); int avr = TEST_SIZE/TEST_THREAD_COUNT; for(int i = 0; i < TEST_THREAD_COUNT; i ++) { final int start = i * avr; final int end = (i + 1) * avr; Thread t = new Thread(new Runnable() { @Override public void run() { for(int j = start; j < end ; j ++) { fastDateFormat.format(dateArray[j]); } } }); t.start(); t.join(); } long endtime = System.currentTimeMillis(); System.out.println("Apache Muti-Thread FastDateFormat format cost:" + (endtime - starttime) + "ms"); } @Test public void test_JDK_SimpleDateFormat_format() throws InterruptedException { long starttime = System.currentTimeMillis(); final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); int avr = TEST_SIZE/TEST_THREAD_COUNT; for(int i = 0; i < TEST_THREAD_COUNT; i ++) { final int start = i * avr; final int end = (i + 1) * avr; Thread t = new Thread(new Runnable() { @Override public void run() { for(int j = start; j < end ; j ++) { sdf.format(dateArray[j]); } } }); t.start(); t.join(); } long endtime = System.currentTimeMillis(); System.out.println("JDK Muti-Thread SimpleDateFormat format cost:" + (endtime - starttime) + "ms"); } @Test public void test_Opencfg_DateFormatUtils_format() throws InterruptedException { long starttime = System.currentTimeMillis(); int avr = TEST_SIZE/TEST_THREAD_COUNT; for(int i = 0; i < TEST_THREAD_COUNT; i ++) { final int start = i * avr; final int end = (i + 1) * avr; Thread t = new Thread(new Runnable() { @Override public void run() { for(int j = start; j < end ; j ++) { DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", dateArray[j]); } } }); t.start(); t.join(); } long endtime = System.currentTimeMillis(); System.out.println("Opencfg Muti-Thread DateFormatUtils format cost:" + (endtime - starttime) + "ms"); } /* Parse */ @Test public void test_Apache_DateUtils_parse() throws ParseException, InterruptedException { long starttime = System.currentTimeMillis(); final String[] dateParten = new String[]{"yyyy-MM-dd HH:mm:ss"}; int avr = TEST_SIZE/TEST_THREAD_COUNT; for(int i = 0; i < TEST_THREAD_COUNT; i ++) { final int start = i * avr; final int end = (i + 1) * avr; Thread t = new Thread(new Runnable() { @Override public void run() { for(int j = start; j < end ; j ++) { try { org.apache.commons.lang.time.DateUtils.parseDate(stringArray[j], dateParten); } catch (ParseException e) { e.printStackTrace(); } } } }); t.start(); t.join(); } long endtime = System.currentTimeMillis(); System.out.println("Apache Muti-Thread DateUtils parse cost:" + (endtime - starttime) + "ms"); } @Test public void test_JDK_SimpleDateFormat_parse() throws ParseException, InterruptedException { long starttime = System.currentTimeMillis(); final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); int avr = TEST_SIZE/TEST_THREAD_COUNT; for(int i = 0; i < TEST_THREAD_COUNT; i ++) { final int start = i * avr; final int end = (i + 1) * avr; Thread t = new Thread(new Runnable() { @Override public void run() { for(int j = start; j < end ; j ++) { try { sdf.parse(stringArray[j]); } catch (ParseException e) { e.printStackTrace(); } } } }); t.start(); t.join(); } long endtime = System.currentTimeMillis(); System.out.println("JDK Muti-Thread SimpleDateFormat parse cost:" + (endtime - starttime) + "ms"); } @Test public void test_Opencfg_DateFormatUtils_parse() throws ParseException, InterruptedException { long starttime = System.currentTimeMillis(); int avr = TEST_SIZE/TEST_THREAD_COUNT; for(int i = 0; i < TEST_THREAD_COUNT; i ++) { final int start = i * avr; final int end = (i + 1) * avr; Thread t = new Thread(new Runnable() { @Override public void run() { for(int j = start; j < end ; j ++) { try { DateFormatUtils.safeParseDate("yyyy-MM-dd HH:mm:ss", stringArray[j]); } catch (ParseException e) { e.printStackTrace(); } } } }); t.start(); t.join(); } long endtime = System.currentTimeMillis(); System.out.println("Opencfg Muti-Thread DateFormatUtils parse cost:" + (endtime - starttime) + "ms"); } }
这里还是使用了100W个String,100W个Date, 每个测试开启10个线程, 测试结果如下:
Apache Muti-Thread FastDateFormat format cost:2265ms JDK Muti-Thread SimpleDateFormat format cost:766ms Opencfg Muti-Thread DateFormatUtils format cost:891ms
Apache Muti-Thread DateUtils parse cost:16766ms JDK Muti-Thread SimpleDateFormat parse cost:3594ms Opencfg Muti-Thread DateFormatUtils parse cost:3860ms
从结果中可以看出Opencfg的DateFormatUtils性能接近与SimpleDateFormat,远远高出Apache的FastDateFormat与DateUtils,同时又提供了基于ThreadLocal的线程安全保障。:)
评论
return (DateFormat)threadLocal.get().get(dateParten);
}
这里threadLocal取出来, 怎么不用close?
你说的是ThreadLocal的remove()吧,貌似木有close()方法,
这里肯定不能remove,因为要缓存,如果remove了,每次都要new SimpleDateFormat,性能很低
return (DateFormat)threadLocal.get().get(dateParten);
}
这里threadLocal取出来, 怎么不用close?
发表评论
-
import static简化代码
2011-11-03 00:10 1699喜欢定义常量的哥们你伤不起啊,好处当然是大大滴,但是定义的名字 ... -
Java永远的伤-中国1927年12月31日午夜
2011-08-15 20:44 3897话说在中国1927年12月31日午 ... -
xss漏洞之进制转换
2011-07-18 01:17 11273SQL注入的事件已经是上个世纪最令人头疼的攻击方法,21世纪又 ... -
tomcat关不掉的原因
2011-07-12 23:51 43534tomcat/bin 目录下的catalina.sh是比较常用 ... -
接口调用频率限制代码
2011-06-28 20:49 10614有很多时候我们写的代码不是你想跑多快就能跑多快的, 因为一些陈 ... -
java调用linux命令传递参数问题
2011-05-18 02:04 10735简单的不带通配符linux命令调用非常简单,使用Runtime ... -
Java位运算的优势
2011-04-09 01:58 2295在Java中对数据的运算,有很好的规范支持,尤其是针对二进制的 ... -
Facebook BigPipe技术
2011-01-04 00:37 2694关于web应用,从html的产生,到客户端浏览器的渲染, ... -
SimpleDateFormat性能调优
2010-11-25 00:12 4218万能的SimpleDateFormat可以把java.util ... -
JMX学习笔记(三)-MXBean
2010-11-10 11:25 4996在MBean中有只要遵循以下两个规则,我们就可以在jc ... -
JMX学习笔记(二)-Notification
2010-11-07 15:25 9025Notification 通知,也可理解为消息,有通知,必 ... -
JMX学习笔记(一)-MBean
2010-10-16 16:27 13654JMX 即 Java Management Ex ... -
cookie安全
2010-07-06 01:09 4148cookie的domian,path,expires, ... -
native2ascii转换后仍然乱码
2010-04-18 17:47 1816native2ascii转换的时候如果不带-encoding ... -
JPA换进下慎用entity
2010-01-26 11:36 2630今天跟一个同事调试代码,突然发现,诸如findUser ... -
http session原理
2009-12-02 00:41 2862大家都知道session是web中在服务器端保存用户状 ... -
java中获得当前目录的各种方法
2009-09-04 11:21 14384Java本来就是跨平台的编程工具,所以当然要做跨平台的 ... -
String、StringBuffer与StringBuilder
2009-04-26 22:04 1928先不废话了,来段程序: package com.tuz; ...
相关推荐
SimpleDateFormat类的线程安全问题是因为它使用了缓存机制来提高解析和格式化的性能。缓存机制使用了一个缓存数组来存储解析和格式化的结果,但是这个缓存数组是共享的,这意味着在多线程环境中,多个线程可能会同时...
总的来说,理解`SimpleDateFormat`的线程不安全性质是Java开发中的一项重要知识,特别是在设计高并发系统时。开发者应当根据具体需求选择合适的方法来确保日期时间格式化的线程安全性,以保证程序的稳定性和正确性。
在多线程环境中,Lock 提供了更高的并发性能。以下是使用 Lock 的示例: ```java import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util....
在Java编程中,`...选择合适的策略来管理和使用`SimpleDateFormat`实例可以避免潜在的并发问题,保证程序的稳定性和性能。在实际开发中,根据项目需求和性能要求,可以选择上述的一种或多种方案来应对。
在性能要求较高的场景下,可以考虑使用`java.time`包中的`DateTimeFormatter`类,它是Java 8及更高版本引入的,提供了更高效且更易用的日期时间格式化功能。 总结来说,`SimpleDateFormat`是Java中处理日期和时间...
Jackson是Java平台上的一个强大的JSON库,它以高性能、易用性以及丰富的功能集著称。本资料主要探讨如何利用Jackson库进行高效的JSON处理。 Jackson库由 FasterXML 组织维护,其核心组件包括: 1. **Jackson-...
要在高并发环境下能有比较好的体验,可以使用ThreadLocal来限制SimpleDateFormat只能在线程内共享,这样就避免了多线程导致的线程安全问题。 ```java private static ThreadLocal<DateFormat> threadLocal = new ...
dateparser是一个智能的高性能datetime解析器库,它支持数百种不同的模式。 为了获得更好的性能和灵活性, dateparser不使用SimpleDateFormat或DateTimeFormatter ,而是使用将指定的String解析为多个匹配的部分,...
此外,`java.time`包在Java 8及更高版本中引入,提供了更现代、更易用的时间日期API,如`LocalDateTime`、`DateTimeFormatter`等,它们在性能和功能上都优于旧的API。 现在回到`DateUtil`工具类,这个类通常包含了...
7. **Java 8及更高版本的新特性**:从Java 8开始,引入了`java.time`包,它提供了更现代且性能更好的日期时间API,如`LocalDate`, `LocalTime`, `LocalDateTime`等,以及`DateTimeFormatter`类,它们在处理日期和...
3. **性能优化**:频繁的日期格式化操作可能影响性能,可以考虑缓存`SimpleDateFormat`实例或使用`java.time`包的类,它们在性能上通常更好。 在实际应用中,我们还需要考虑到日期格式化的需求可能因业务场景不同而...
3. **性能优化**:在高并发场景下,可以考虑使用线程安全的日期格式化工具类,如`DateTimeFormatter`。 #### 六、总结 通过上述内容的学习,我们不仅了解了如何在Java中实现字符串到日期的转换,还深入探讨了相关...
- **性能考虑**:如果在高并发环境下频繁调用此方法,可以考虑使用线程安全的`DateTimeFormatter`类(Java 8及以上版本提供)代替`SimpleDateFormat`,后者不是线程安全的。 - **国际化支持**:在处理不同语言环境...
1. **高性能**:FastIntMap通过直接使用整数作为数组索引来提高查询速度,减少了对象创建和垃圾回收的开销。 2. **紧凑存储**:相比于HashMap,FastIntMap不需要存储键对象,只存储值,因此在内存使用上更为高效。 3...
- **性能考虑**:对于频繁调用的情况,可以考虑重用`SimpleDateFormat`实例以提高性能。 - **国际化支持**:如果应用需要支持多种语言和地区,应当使用`DateTimeFormatter`来实现更好的国际化处理。 通过上述内容,...
如果你的项目支持Java 8或更高版本,可以使用`java.time.format.DateTimeFormatter`,它提供了更强大的功能和更好的性能: ```java LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant....
虽然这会增加内存开销,但在低并发或者对性能要求不高的场景下,这是一个简单且可行的选择。 3. **同步访问**: 如果必须复用`DateFormat`实例,可以通过同步机制来控制对它的访问。然而,这将降低并行性能,因为...
这里,`SimpleDateFormat`的模板与`DateTimeFormatter`类似,但其性能和灵活性略逊于新API。 至于描述中的“翻页”部分,可能是关于滚动或者UI更新的问题。如果内容是TextView的一部分,通常需要处理文本的加载和...
其次,`java.util.concurrent.ThreadLocalRandom`是Java 7引入的,它提供了一种线程安全的随机数生成方式,通常在多线程环境下效率更高。它的用法和`Random`类似,但默认就是线程局部的,无需担心并发问题。 然后,...
JDK 1.4引入了NIO(非阻塞I/O),为Java提供了更高性能和更灵活的I/O操作方式。NIO允许应用程序在处理I/O事件时避免阻塞,提高了并发处理能力,特别适用于高并发网络应用。主要类包括`java.nio.channels`包下的`...