java中,用synchronized会锁定当前对象,这个对象指的是它包涵的代码块,还是一个类实例

Python014

java中,用synchronized会锁定当前对象,这个对象指的是它包涵的代码块,还是一个类实例,第1张

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方法,所有线程都可以进来!

    }

}