class SynchronizedUtils {
//obj
private StringmResult;
/**
* 类锁
* a方法,它考察面试者对static关键字的理解
*
* static方法一般称为静态方法,又叫类方法。从名字就可以知道,它是隶属于一个类的。因此调用static方法的时候直接使用类名就可以。
* static方法不依附于任何对象而存在,因此是不可以使用this来调用的。也正是由于这个特性,
* 我们在static方法中不能访问类的非静态变量和非静态方法,因为类的非静态变量和非静态方法是依附于对象而存在的。
*/
public synchronized static void a() {
}
/**
* 对象锁
* 用synchronized关键字修饰的方法叫同步方法,它是用来做同步操作的。很多面试者认为synchronized锁定的是代码块,其实不然。它锁定的是调用当前方法的对象。
* 实际上,t1和t2两个线程需要去竞争SynchronizedUtils对象的锁,谁竞争到锁,谁就先执行,而另一个则后执行。
* 在Java中,Jvm会为每个对象内置一个监视器(monitor),监视器中有一个地方叫监视区域,任何线程要想执行这个对象的synchronized方法,都必须先进入到该对象的监视区域。
* 监视器负责保证同一时刻只有一个线程在监视区域执行。
*/
public synchronized void b() {
}
/**
* 类锁
* 在Java中,任何一个对象都能找到其所属的类。Jvm会为每个类都维护唯一的一个Class类对象,用于记录这个类的原始信息,这也是Java中反射机制能够存在的底层基础。
* 如果你了解这个机制,你就可以理解c方法中的synchronized代码块的作用。它是给Demo类对应的Class对象加锁的,即多个线程会竞争以进入Demo.class这个对象的监视器区域。
* 那就是用static synchronized 修饰的a方法也是锁定的Demo.class对象,所以,c方法和a方法是等价的。
*/
public static void c() {
synchronized (SynchronizedUtils.class) {
}
}
/**
* 对象锁
* this指的是调用当前方法的对象。
* 第一次调用时,synchronized(this)中的this指定的SynchronizedUtils对象,因此锁定的是SynchronizedUtils对象。第二次调用时,synchronized(this)中的this指定的demo2对象,因此锁定的是demo2对象。
*
*/
public void d() {
synchronized (this) {
}
}
}
网友评论