synchronized块 锁定的是制定对象,,,,,代码块只是锁定期间执行的操作
synchronized 修饰非静态方法 锁定的是该类的实例 同一实例在多线程中调用才会触发同步锁定 所以 多个被synchronized修饰的非静态方法在同一实例下 只能多线程同时调用一个
synchronized 修饰静态方法 锁定的是类本身,而不是实例, 同一个类中的所有被synchronized修饰的静态方法, 只能多线程同时调用一个
synchronized块 直接锁定指定的对象,,,,该对象在多个地方的同步锁定块,,,只能多线程同时执行其中一个
其他未获得锁的线程需要等待获得锁的线程执行完成并释放锁,
如果同时有多个线程等待锁释放,,那么锁释放后,等待的线程谁会获得锁,,这个不同JVM可能有差异
public class Run{
Object lock
public synchronized void runA()
{
}
public synchronized void runB()
{
}
public void runC()
{
synchronized (this)
{
}
}
public void runD()
{
synchronized (lock)
{
}
}
}
举例: 以上runA,runB,runC三个方法在同一实例多线程中互斥,他们都锁定的是this,当前类且调用当前方法的实例
而runD方法不和上面三个互斥,因为锁定的不是this,而是lock
Java每一个class都提供类似于moniter的保证同步,保护共享数据的操作。正如你所说,notify是唤醒一个等待的线程,如果没有任何线程在等待,Notify将没有任何操作。
只有当对象上有线程陷入等待时,调用notify会唤醒第一个陷入等待的线程。
synchronized void show(){
//放在方法上面就锁住,整个方法里面所有的语句!
//1线程进来了,2线程就进不来,除非被wait,或者强制结束!
}
void method()
{
synchronized(this)
{
//如果放在这里,只能说,这个代码块里面的语句被锁!
//1线程进来在这里里面执行,2就进不来,会在这个代码块外面候着,除非1被挂起!
//但是method方法,所有线程都可以进来!
}
}