饿汉式静态变量

  1. public class Singleton01 {
  2. public static void main(String[] args) {
  3. Singleton instance1 = Singleton.getinstance();
  4. Singleton instance2 = Singleton.getinstance();
  5. System.out.println(instance1 == instance2);
  6. }
  7. }
  8. class Singleton {
  9. private Singleton() {
  10. }
  11. private final static Singleton instance = new Singleton();
  12. public static Singleton getinstance() {
  13. return instance;
  14. }
  15. }

饿汉式静态代码块

  1. public class Singleton02 {
  2. public static void main(String[] args) {
  3. Singleton instance1 = Singleton.getinstance();
  4. Singleton instance2 = Singleton.getinstance();
  5. System.out.println(instance1 == instance2);
  6. }
  7. }
  8. class Singleton {
  9. private Singleton() {
  10. }
  11. private static Singleton instance;
  12. static{
  13. instance=new Singleton();
  14. }
  15. public static Singleton getinstance() {
  16. return instance;
  17. }
  18. }

懒汉式(线程不安全)

  1. public class Singleton3 {
  2. public static void main(String[] args) {
  3. Singleton instance1 = Singleton.getinstance();
  4. Singleton instance2 = Singleton.getinstance();
  5. System.out.println(instance1 == instance2);
  6. }
  7. }
  8. class Singleton {
  9. private Singleton (){
  10. }
  11. private static Singleton instance;
  12. public static Singleton getinstance(){
  13. if(instance==null){
  14. instance=new Singleton();
  15. }
  16. return instance;
  17. }
  18. }

懒汉式(线程安全,同步,效率低下)

  1. public class Singleton4 {
  2. public static void main(String[] args) {
  3. Singleton instance1 = Singleton.getinstance();
  4. Singleton instance2 = Singleton.getinstance();
  5. System.out.println(instance1 == instance2);
  6. }
  7. }
  8. class Singleton {
  9. private Singleton (){
  10. }
  11. private static Singleton instance;
  12. public static synchronized Singleton getinstance(){
  13. if(instance==null){
  14. instance=new Singleton();
  15. }
  16. return instance;
  17. }
  18. }

双重检查(线程安全,同步)

  1. public class Singleton5 {
  2. //双重检查(线程安全,同步)
  3. public static void main(String[] args) {
  4. Singleton instance1 = Singleton.getinstance();
  5. Singleton instance2 = Singleton.getinstance();
  6. System.out.println(instance1 == instance2);
  7. }
  8. }
  9. class Singleton {
  10. private Singleton(){
  11. }
  12. //volatile保证可见性,防止指令重排
  13. private static volatile Singleton instance;
  14. public static Singleton getinstance(){
  15. if(instance==null){
  16. synchronized (Singleton.class) {
  17. if(instance==null){
  18. instance = new Singleton();
  19. }
  20. }
  21. }
  22. return instance;
  23. }
  24. }

静态内部类

  1. public class Singleton6 {
  2. public static void main(String[] args) {
  3. Singleton instance1 = Singleton.getinstance();
  4. Singleton instance2 = Singleton.getinstance();
  5. System.out.println(instance1 == instance2);
  6. }
  7. }
  8. class Singleton {
  9. private Singleton() {
  10. }
  11. //写一个静态内部类,该类有一个静态属性Instance
  12. private static class SingletonInstance {
  13. private final static Singleton Instance = new Singleton();
  14. }
  15. public static Singleton getinstance() {
  16. return SingletonInstance.Instance;
  17. }
  18. }