1 多線程環境下的構造函數調用java
構造函數自己並無隱式的同步,由於各個線程構建的是本身的對象,它們之間是不存在競爭關係的。安全
2 class loader在load class時被了sychronized多線程
java.lang.ClassLoader->loadClass(String name)->sychronized Class<?> loadClass(String name, boolean resolve).函數
在這個被sychronized的loadClass中,會去檢查是否該類已經加載了,若是已經加載了,就直接去resolve這個已經加載的類。關鍵是,返回這個Class對象前,都是在synchronized函數裏面的,因此對static變量的初始化是已經被synchronized,是線程安全的。spa
package Singleton;
public class EagerSingleton {
//餓漢單例模式
//在類加載時就完成了初始化,因此類加載較慢,但獲取對象的速度快
private static EagerSingleton instance = new EagerSingleton();//靜態私有成員,已初始化
private EagerSingleton()
{
//私有構造函數
}
public static EagerSingleton getInstance() //靜態,不用同步(類加載時已初始化,不會有多線程的問題)
{
return instance;
}
}
3 synchronized method
一個synchronized函數,假如一個線程進了,那麼其它線程將會被suspend。