深圳宏电笔试
程序员文章站
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;
}
}
同步代码块的这两种方式都是比较推荐使用的。
上一篇: SpringBoot的定时器使用
下一篇: 给标签自定义属性html