欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深圳宏电笔试

程序员文章站 2022-06-09 11:17:38
...

1.JVM、JRE、JDK是什么,各包含什么?它们的功能范围排个序?
JVM:Java虚拟机,JVM就是一个软件,针对不同的操作系统,提供了不同版本的JVM,Java代码经过一次编译生成统一的字节码文件,字节码文件都运行在JVM中。
JDK:开发者工具,包含JRE,编译工具:javac.exe,运行工具:java.exe,文档生成工具:javadoc。
JRE:JRE是Java程序的运行环境,为Java代码的运行提供了核心类库的支持,JRE包含JVM。
因此功能范围排序:JDK > JRE > JVM
2.但是在多线程环境下,单例类就有可能会失效,这个时候就要对其加锁了,来确保线程安全。
对线程加锁的synchronized关键字,用法分为两种:
1.加载方法名之前,如:synchronized methodName(params){…};
2.声明同步块,如:synchronized(this){…};

public class Singleton{
	private  static  Singleton  instance = null;
	private Singleton(){}
	private synchronized static Singleton getInstance(){
			if(instance == null){
			instance = new Singleton();
			}
			return instance;
	}
}
这种方式效率比较低,性能不是太好,不推荐使用,不过也可以用,因为是对整个方法加上了线程同步,其实只要在new的时候考虑线程同步就行了。

同步代码块:

public class Singleton{
	private static Singleton instance;
	private final static Object syncLock = new Object();
	private Singleton(){}
	public synchronized static Singleton getInstance(){
		if(instance == null){
			synchronized(synLock){
				 if(instance == null){
				 	instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

synchronized同步块括号中的锁定对象是采用的一个无关的Object类实例,而不是采用this,因为getInstance是一个静态方法,在它内部不能使用未静态的或者未实例的类对象,因此也可以用下面的方法来实现:

public class Singleton{
	private static Singleton instance;
	private Singleton(){}
	public static Singleton getInstance(){
		if(instance == null){
		synchronized(Singleton.class){
			if(instance == null){
					instance = new Singleton();
		    	}
	      	}	
         }
         return instance;
    }
 }
同步代码块的这两种方式都是比较推荐使用的。
相关标签: 笔试