synchronized block not locking the object reference

前端 未结 3 2039
梦谈多话
梦谈多话 2021-01-24 01:51
class Demo
{
    void demo()
    {
        System.out.println(\"Inside demo of \"+Thread.currentThread().getName());
        try
        {
            Thread.sleep(10000         


        
相关标签:
3条回答
  • 2021-01-24 02:25

    So, when MyThread1 is executing, due to the synchronized block, the monitor of d should be locked, resulting in denial of access to d.demo() by the MyThread2.

    That would only happen if MyThread2 also had a synchronized block. When one thread is synchronized on an object, other threads will be blocked if they also try to synchronize on that same object. If they don't synchronize, they won't be. There's nothing that stops access to an object from threads that don't synchronize on it.

    Synchronization is a cooperative mechanism. It only works when all threads work together.

    0 讨论(0)
  • 2021-01-24 02:28

    Synchronization is a collaborative effort. Each party states that when another party is in a critical section, they won't be.

    You've only synchronized access to the demo method of the Demo instance in one thread

    synchronized(d)
    {
        d.demo();
    } 
    

    The other is accessing it directly

    d.demo();
    

    They've broken these collaboration rules so you can't assume anything.

    This is explained in the JLS

    Acquiring the lock associated with an object does not in itself prevent other threads from accessing fields of the object or invoking un-synchronized methods on the object. Other threads can also use synchronized methods or the synchronized statement in a conventional manner to achieve mutual exclusion.

    0 讨论(0)
  • 2021-01-24 02:33

    The synchronization only occurs in Thread1. Since Thread2 does not synchronize on d, it is allowed to invoke demo() while Thread1 holds the lock.

    You seem to be misunderstanding the use of synchronized. Synchronization only occurs with other threads trying to enter a synchronized block of the common object.

    0 讨论(0)
提交回复
热议问题