class A { public void foo(int p) { System.out.println("p = [" + p + "]"); } public synchronized void foo(){ foo(calcSomething()); } // this method should be invoked under synchronized block! private int calcSomething() { return 0; } }