11

When we talk about intrinsic lock we refer to the object for which we ask the lock or for the synchronized method?

The lock is on the object or on it's sync method?

I'm confused!

xdevel2000
  • 20,780
  • 41
  • 129
  • 196

6 Answers6

17

Intrinsic locks are on the object:

class A
{
   public synchronized void method1(){...}
   public synchronized void method2(){...}
}

If thread A is in method1 then threadB cannot enter method2.

pauljwilliams
  • 19,079
  • 3
  • 51
  • 79
11

In Java, an intrinsic lock is implied by each use of the synchronized keyword

Each use of the synchronized keyword is associated with one of the two types of intrinsic lock:

an "instance lock", attached to a single object

a "static lock", attached to a class

If a method is declared as synchronized, then it will acquire either the instance lock or the static lock when it is invoked, according to whether it is an instance method or a static method.

The two types of lock have similar behaviour, but are completely independent of each other.

Acquiring the instance lock only blocks other threads from invoking a synchronized instance method; it does not block other threads from invoking an un-synchronized method, nor does it block them from invoking a static synchronized method.

Similarly, acquiring the static lock only blocks other threads from invoking a static synchronized method; it does not block other threads from invoking an un-synchronized method, nor does it block them from invoking a synchronized instance method.

Outside of a method header, synchronized(this) acquires the instance lock.

The static lock can be acquired outside of a method header in two ways:

synchronized(Blah.class), using the class literal

synchronized(this.getClass()), if an object is available

Dhiral Pandya
  • 10,311
  • 4
  • 47
  • 47
4

Synchronized methods locks the method on the object

synchronized void methodA () {
    ....    
}

is somehow equivalent to

void methodA () {
    synchronized (this) {
        ....
    }
}
nanda
  • 24,458
  • 13
  • 71
  • 90
  • Every object has an intrinsic lock. These two statements are equivalent because both are synchronizing on the intrinsic lock of the object containing methodA(). – Brandon Feb 01 '13 at 22:06
  • Explaining Synchronized statements to a person who dosen't understand Synchronized Methods isn't a good idea.This just confused me even more. – DollarAkshay Jul 12 '14 at 02:11
1

The lock is part of the Object. Every Object has one and it may be locked in two ways:

  1. Using the synchronized modifier on an instance method of the Class to lock the associated object
  2. Using a synchronized(object) {} block

Similarly, you can lock the Class of an Object instead of the Object itself (bares mentioning separately to understand the synchronized modifier with a static method):

  1. Using the synchronized modifier on a static method of the Class to lock the Class
  2. Using a synchronized(clazz) {} block where clazz is the Class of the Object
Mike Tunnicliffe
  • 10,674
  • 3
  • 31
  • 46
0

Lock is on the object. In Java every object is a monitor

Fakrudeen
  • 5,778
  • 7
  • 44
  • 70
0
private int count = 0;
public synchronized void countFunc(){
        count++;
    }
Thread t1 = new Thread(new Runnable(){
            public void run(){
            for(int i=0;i<1000;i++){
                countFunc();
                }}});
        Thread t2 = new Thread(new Runnable(){
            public void run(){
            for(int i=0;i<1000;i++){
                countFunc();
            }}});

In the above example, I have 2 threads trying to increment the value of count. And to prevent thread interleaving I am trying to grab an intrinsic lock by the use of synchronized keyword.

Conclusively, In this example, lock is the method block countFunc with the synchronized keyword and lock is on the count variable. Hope this helps