• java什么时候声明static方法


      1. 经常用到的方法,可以声明为static,在外部调用静态方法时,可以使用“类名.方法名”或者“对象名.方法名”的形式。这样省去了每次new对象的内存空间,因为非static方法,需要new对象才能调用此方法。但因此也产生多线程访问线程安全问题。比如:

    import com.google.common.util.concurrent.ThreadFactoryBuilder;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.*;
    
    /**
     * @version V1.0
     * @ClassName: PoolUtil
     * @Description: 初始化线程池
     */
    @Slf4j
    public class PoolUtil {
        public static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;
    
        /**
         *初始化线程池
         * @param threadName: thread name
         * @return
         */
        public static ExecutorService initPoolExecutor(String threadName) {
            ThreadFactory guavaFactory = new ThreadFactoryBuilder().setNameFormat(threadName).build();
            ThreadPoolExecutor pool =  new ThreadPoolExecutor(CORE_POOL_SIZE,
                    256,30L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<>(Integer.MAX_VALUE), guavaFactory);
            pool.allowsCoreThreadTimeOut();
            return pool;
        }
    }
    

    只初始化一个线程池。

      2.当一个方法或者变量需要在类加载器加载类的时候就被初始化,则声明为static。Static变量在项目启动时就分配内存,直到程序结束释放内存。static和const变量在项目启动时就已经分配内存了,而且方法调用之后也不会被释放。

    class MyClass {
        public final double differentValue = Math.random();
        public static double sameValue = Math.random();
    }
    

      如上示例中,differentValue的值每次都变化,但是sameValue的值是相同的。

      3.声明为static方法后,内存中就只有一份数据了。所以就要注意线程安全问题,就需要加同步处理。线程就会等待访问了,就会有线程安全问题。

  • 相关阅读:
    浅谈c/c++中的指针问题
    谈谈八大排序算法问题
    隐藏在default construct后面的是什么
    浅谈编译过程和符号表重定位问题
    1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?
    成长从今天开始
    正则表达式
    安装RPM包或者安装源码包
    文档的压缩与打包
    文本编辑工具
  • 原文地址:https://www.cnblogs.com/east7/p/15875929.html
Copyright © 2020-2023  润新知