java是不是同步方法会自动加this锁,静态同步代码(名字可能不对)会自动加“名.class”锁

Python014

java是不是同步方法会自动加this锁,静态同步代码(名字可能不对)会自动加“名.class”锁,第1张

//看注释!

class TestLock

{

//非静态方法,默认锁是this

synchronized void show1()

{

}

//非静态方法,如果方法没有锁,里面同步代码块!

void show2()

{

//这里可以填写this,填什么都可以,只要是唯一,对象,类,都可以!

synchronized(this)

{

//这个同步代码块,如果不和上面方法进行同锁,填什么都可以,包括class文件都可以

//但是为了和上面方法同步的话,就必须this了,因为方法的锁此刻默认就是this!

}

}

//静态方法看这里!

static synchronized void method1()

{

//注意这个同步方法的锁,这会默认就不在是this了,而是(TestLock.class)了

}

//静态同步代码块!

static void method2()

{

synchronized(TestLock.class)

{

//这里建议这么写,该方法所属的class文件,当然,写其他类的字节码文件也是可以的!

//但是这里绝对不可以this

//如果和该上买呢静态方法同步的话,必须TestLock.class

}

}

}

synchronized(this) 表示的是所有线程需要排队获取当前类的实例的锁;而 synchronized(xxx.class) 表示的是所有线程需要排队获取当前类的锁;区别就在于 this 是一个实例,而 xxx.class 是一个整个的 class 信息。

多线程的同步锁通过synchronized实现

有俩种方式 一种是在代码块加锁

代码块加锁时可以指定任意类的实例过的对象

即锁在这个对象上(任何对象都有一个锁)

使同一时间内只有一个线程可以访问到代码块中

另外一种就是以synchronized关键字修饰方法

这时加锁的对象就是类本身的实例 即this

以上 O(∩_∩)O