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!
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!
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.
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
Synchronized methods locks the method on the object
synchronized void methodA () {
....
}
is somehow equivalent to
void methodA () {
synchronized (this) {
....
}
}
The lock is part of the Object. Every Object has one and it may be locked in two ways:
synchronized
modifier on an instance method of the Class to lock the associated objectsynchronized(object) {}
blockSimilarly, 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):
synchronized
modifier on a static method of the Class to lock the Classsynchronized(clazz) {}
block where clazz
is the Class of the Objectprivate 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