最近积累的一些java细节
最近几天一直在钻研多线程问题,因为这一块一直是弱项,之前一直近不下心来细细学习,这些天网上看了一些资料,感觉受益匪浅,在此记录一下。
昨天看到关于静态类的并发问题,开始看着挺蛋疼的,擦,静态类里面怎么可能会有并发问题,设计有问题吧,用静态类处理全局变量,找抽么@。@。于是蛋疼实验了一下,哈哈,蛮好玩的!如有错误之处,欢迎指正,谢谢!
下面是代码:
首先是一个工具类,用于时间相关计算
[java]
public final class TimeUtil {
/* 这里故意声明了一个全局的calendar实例,让static方法改变这个实例(到底是实例还是句柄,待我灯下测试即知)的日期,凸显并发问题! */
private static Calendar calendar = Calendar.getInstance();
/**
* 根据用户输入时间获取这一年的第几天
* @param date
* @return dayOfYear
*/
public static int getDay(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_YEAR);
}
/**
* 根据用户输入时间获取月份
* @param date
* @return month 值为月份-1
*/
public static int getMonth(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.MONTH);
}
/**
* 根据给定字符串获得对应日期
* @param str 格式 yyyy-MM-dd hh:mm:ss
* @return
*/
public static Date getTimeByStr(String str) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date time = null;
try {
time = df.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return time;
}
public final class TimeUtil {
/* 这里故意声明了一个全局的calendar实例,让static方法改变这个实例(到底是实例还是句柄,待我灯下测试即知)的日期,凸显并发问题! */
private static Calendar calendar = Calendar.getInstance();
/**
* 根据用户输入时间获取这一年的第几天
* @param date
* @return dayOfYear
*/
public static int getDay(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_YEAR);
}
/**
* 根据用户输入时间获取月份
* @param date
* @return month 值为月份-1
*/
public static int getMonth(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.MONTH);
}
/**
* 根据给定字符串获得对应日期
* @param str 格式 yyyy-MM-dd hh:mm:ss
* @return
*/
public static Date getTimeByStr(String str) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date time = null;
try {
time = df.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return time;
}
接着是一个测试线程类
[java]
public class TestStaticThread implements Runnable {
String timeStr;
public TestStaticThread(String timeStr) {
this.timeStr = timeStr;
}
@Override
public void run() {
try {
//不加sleep时间效果不明显啊!
Thread.sleep(100L);
Date time = TimeUtil.getTimeByStr(timeStr);
int day = TimeUtil.getDay(time);
int month = TimeUtil.getMonth(time);
System.out.println("线程[" + Thread.currentThread().getName() + "]指定日期为[" + timeStr + "], " +
"经过幸苦的计算后, 得到的天数为[" + day + "], 得到的月份为[" + (month + 1) + "月]");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class TestStaticThread implements Runnable {
String timeStr;
public TestStaticThread(String timeStr) {
this.timeStr = timeStr;
}
@Override
public void run() {
try {
//不加sleep时间效果不明显啊!
Thread.sleep(100L);
Date time = TimeUtil.getTimeByStr(timeStr);
int day = TimeUtil.getDay(time);
int month = TimeUtil.getMonth(time);
System.out.println("线程[" + Thread.currentThread().getName() + &qu
补充:软件开发 , Java ,