2013-11-28 3 views
0

Например, в перепроверены замке одноплодного шаблона,В чем смысл SomeObject.class в java?

public class Singleton { 
private volatile static Singleton uniqueInstance; 
private Singleton() {} 
public static Singleton getInstance() { 
    if (uniqueInstance == null) { 
     synchronized (Singleton.class) { 
    if (uniqueInstance == null) { 
     uniqueInstance = new Singleton(); 
    } 
} 
} 
return uniqueInstance; 
} 
} 

Что значит «Singleton.class»? Это объект?

Теперь я знаю, что это объект класса, тогда мы можем использовать другие объекты для синхронизации здесь? Такие, как «это»?

ответ

1

Для каждого класса в JAVA существует объект. Этот объект является объектом class. Этот объект синглтон объекта и может быть извлечена с помощью Class object=ClassName.class или Class object=Class.forName('ClassName');


Read this for more details.

Для вашего кода synchronized (Singleton.class) означает, что вы замок на классе, так что статический доступ член синхронный режим.

+0

Получил, спасибо! – computerscience99

+0

Не проблема. @ yuanliu200 –

4

Он представляет объект Class этого класса. Как только вы получите объект Class, вы можете сделать множество вещей, например получить поля класса, методы класса, пакет класса и т. Д.

Чаще всего вы будете использовать его для получения ресурсов в виде потока. То есть, когда вы хотите получить встроенный ресурс из файла jar. Для получения более подробной информации, have a look at the documentation

Выполнить код, приведенный ниже, непосредственно по адресу: http://ideone.com/h1czR5

SSCCE

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 
import java.lang.reflect.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Class string = String.class; 

     System.out.println("Package: " + string.getPackage()); 
     System.out.println("Fields: " + java.util.Arrays.toString(string.getFields())); 
     Method[] methods = string.getMethods(); 

     for(int i = 0; i < 10; i++){ 
      System.out.println(methods[i]); 
     } 

    } 
} 

Выход:

Package: package java.lang, Java Platform API Specification, version 1.7 
Fields: [public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER] 
public boolean java.lang.String.equals(java.lang.Object) 
public java.lang.String java.lang.String.toString() 
public int java.lang.String.hashCode() 
public int java.lang.String.compareTo(java.lang.Object) 
public int java.lang.String.compareTo(java.lang.String) 
public int java.lang.String.indexOf(java.lang.String,int) 
public int java.lang.String.indexOf(int) 
public int java.lang.String.indexOf(int,int) 
public int java.lang.String.indexOf(java.lang.String) 
public static java.lang.String java.lang.String.valueOf(float) 
+0

спасибо за подробный ответ! – computerscience99

+0

@ yuanliu200 Добро пожаловать. На большинство общих вопросов уже был дан ответ на Stack, включая более технические. Хорошо их искать, прежде чем публиковать вопрос. Это экономит время и силы. –

1

Вы синхронизируете на «класс "объект. Объект класса содержит некоторые данные «о классе».