原题如下:
Which three will compile and run without exception? (Choose three.)
A. private synchronized Object o;
B. void go() {
synchronized() { /* code here */ }
C. public synchronized void go() { /* code here */ }
D. private synchronized(this) void go() { /* code here */ }
E. void go() {
synchronized(Object.class) { /* code here */ }
F. void go() {
Object o = new Object();
synchronized(o) { /* code here */ }
E当中的synchronized(Object.class)还是头一次看到。这是什么语法呢?
Which three will compile and run without exception? (Choose three.)
A. private synchronized Object o;
B. void go() {
synchronized() { /* code here */ }
C. public synchronized void go() { /* code here */ }
D. private synchronized(this) void go() { /* code here */ }
E. void go() {
synchronized(Object.class) { /* code here */ }
F. void go() {
Object o = new Object();
synchronized(o) { /* code here */ }
E当中的synchronized(Object.class)还是头一次看到。这是什么语法呢?
Object.class也是个对象,是Object类的类对象。
B中是非法的表达式。
C是正确的。
D中括号里不可以存在this关键字,里面可以是类,接口,和枚举。
E是正确的。
F也是正确的。
而对于E中Object.class其实就是一个类。
class TestOC{
public static void main(String[] args){
System.out.println(Object.class);
System.out.println(new Object());
System.out.println(new TestOC());
System.out.println(TestOC.class);
}
}
输出如下:
class java.lang.Object
java.lang.Object@55a6c368
TestOC@37670cc6
class TestOC
三楼的朋友说了,任何类都可以点出class属性的。
synchronized后面也应该跟个对象呀,而不是类。
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 以下示例使用 Class 对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获得命名类型(或 void)的 Class 对象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
synchronized语句主要是解决多线程情况下同步问题,那么就要看你想要让哪些东西同步,这直接关系到你选用的作为锁的对象。
Object.class作为锁对象的好处是,在整个虚拟机范围内只有一个该对象,那么,凡是以之为锁的代码都同步!
有不懂的 可以继续提问滴 我很热心 呐 \(^o^)/~
Object.class - 这里的Object可以是任意类,用于同步静态方法。把原文作了截图:
synchronized(Object.class)这样锁的就是类本身,可以用于修改类的静态属性