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回答

悟空

2022-04-18

是的,也可以

0
2
丨木頭丶吅
4-10看到了,ThreadLocal形式应该是创建#{currentPoolSize}次
2022-04-20
共2条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程