Question: Why is it that two synchronized blocks can't be executed simultaneously by two different threads in Java.

**EDIT**

```
public class JavaApplication4 {

    public static void main(String[] args) {
        new JavaApplication4();
    }

    public JavaApplication4() {
        Thread t1 = new Thread() {

            @Override
            public void run() {
                if (Thread.currentThread().getName().equals("Thread-1")) {
                    test(Thread.currentThread().getName());
                } else {
                    test1(Thread.currentThread().getName());
                }
            }
        };
        Thread t2 = new Thread(t1);
        t2.start();
        t1.start();

    }

    public synchronized void test(String msg) {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
            }
            System.out.println(msg);
        }
    }

    public synchronized void test1(String msg) {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
            }
            System.out.println(msg + " from test1");
        }
    }
}

```

Answer: 
That is the whole concept of synchronization, if you are taking a lock on an object (or a class), none of the other threads can access any synchronized blocks.

Example 

```
Class A{

public void method1()
{
 synchronized(this)//Block 1 taking lock on Object
 {
  //do something
 }
}

public void method2()
{
 synchronized(this)//Block 2 taking lock on Object
 {
  //do something
 }
}
}

```

If one thread of an Object enters any of the synchronized blocks, all others threads **of the same object** will have to wait for that thread to come out of the synchronized block to enter any of the synchronized blocks. If there are N number of such blocks, only one thread of the Object can access only one block at a time. Please note my emphasis on **Threads of same Object**. The concept will not apply if we are dealing with threads from different objects. 

Let me also add that if you are taking a lock on **class**, the above concept will get expanded to any object of the class. So if instead of saying `synchronized(this)`, I would have used `synchronized(A.class)`, code will instruct JVM, that irrespective of the Object that thread belongs to, make it wait for other thread to finish the synchronized block execution.

Edit: Please understand that when you are taking a lock (by using synchronized keyword), you are not just taking lock on one block. You are taking lock on the object. That means you are telling JVM "hey, this thread is doing some **critical work** which might change the state of the object (or class), so don't let any other thread do any other **critical work**" . Critical work, here refers to all the code in synchronized blocks which take lock on that particular Object (or class), and not only in one synchronized block.
Two Threads can execute synchronized blocks simultaneously till the point they are not locking the same object.

In case the blocks are synchronized on different object... they can execute simultaneously.

```
synchronized(object1){
    ...
}

synchronized(object2){
    ...
}

```

**EDIT:**
`Please reason the output for http://pastebin.com/tcJT009i`

**In your example when you are invoking synchronized methods the lock is acquired over the same object. Try creating two objects and see.**