4-4,改进加锁的时候,用方法锁是不是也可以做到提升效率且线程安全
来源:4-4 不佳做法

丨木頭丶吅
2022-04-18
public class NormalUsage_Sync_03 {
public static ExecutorService pool = Executors.newFixedThreadPool(10);
public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
/**
* 参数的单位是ms,从1970开始偏移
* @param seconds
* @return
*/
public String sec2Date(int seconds) {
Date date = new Date(seconds * 1000);
String format;
/*这里用类锁(串行)或者方法锁(并行,每个线程是不同对象),结果一样*/
// synchronized (NormalUsage_Sync_03.class) {
synchronized (this) {
format = simpleDateFormat.format(date);
}
return format;
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3000000; i++) {
int finalI = i;
pool.submit(() -> System.out.println(new NormalUsage_Sync_03().sec2Date(finalI)));
}
pool.shutdown();
}
}
因为我自己的电脑在运行的时候,设为了static且没有加锁,跑了30w次也没有出现线程不安全的问题(相同的时间),没办法验证想法,不过肯定问题是出现在format方法中。如果不加类锁而是加方法锁,反正每个线程创建了对象的副本,应该也可以提升效率(指不串行,尽管创建、销毁NormalUsage_00()的消耗还是大),且达到线程安全吧?
写回答
1回答
-
是的,也可以
022022-04-20
相似问题