public void show1(String str) {
int len =str.length();
synchronized (this) {
for (int i = 0; i < len; i++) {
System.out.print(str.charAt(i));
}
System.out.println();
}
}
public static synchronized void show3(String str) {
int len =str.length();
for (int i = 0; i < len; i++) {
System.out.print(str.charAt(i));
}
System.out.println();
}
想要show1和show3互斥就需要把this改成 类名.class 获取的是字节码对象锁
**
Java 对象的创建过程
**
当一个对象被创建时,虚拟机就会为其分配内存来存放对象自己的实例变量及其从父类继承过来的实例变量(即使这些从超类继承过来的实例变量有可能被隐藏也会被分配空间)。在为这些实例变量分配内存的同时,这些实例变量也会被赋予默认值(零值)。在内存分配完成之后,Java虚拟机就会开始对新创建的对象按照程序猿的意志进行初始化。在Java对象初始化过程中,主要涉及三种执行对象初始化的结构,分别是 实例变量初始化、实例代码块初始化 以及 构造函数初始化。
也就是说this获取的是类实例化之后类的对象锁。
**
类的加载
**
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存中创建一个Java.lang.Class对象用来封装类在方法区内的数据结构。
show3加了static的静态方法,他是在加载类的时候就会生成出来show3方法。
而他拿的锁对象是Java.lang.Class对象,不是对象实例化后的对象。
所以我们可以通过 类名.class 来获取***Java.lang.Class对象*** 这样就能起到同步的作用、