class TestLock
{
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