代碼實例如下:
package runnable;
import java.math.BigDecimal;
public class ThreadDemo {
public static void main(String[] args) {
SynObject synObject=new SynObject();
test tes=new test();
Runnable r1=()->{synObject.methodA();};
Runnable r2=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synObject.methodB();
}
};
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
Thread t3=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synObject.methodC();
}
});
Thread t4=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tes.methodD();
tes.methodE();
}
});
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class SynObject{
public static Object ObjectSyn=new Object();
public synchronized void methodA(){
System.out.println("methodA");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void methodB(){
synchronized(this){
System.out.println("methodB");
}
}
public void methodC(){
synchronized(ObjectSyn){
System.out.println("methodC");
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class test{
public void methodD(){
synchronized(SynObject.ObjectSyn){
System.out.println("methodD");
}
}
public void methodE(){
synchronized(SynObject.ObjectSyn){
System.out.println("methodE");
}
}
}
以上代碼運行結果爲:
methodA和methodC很快被打印出來,接着等了數秒,methodB被打印出來,再接着等了數秒,methodD和methodE被打印出來。
通過上面的例子說明:methodA和methodB用的是同一把鎖,methodC和methodD以及methodE用的是同一把鎖,當線程4獲得鎖對象SynObject.ObjectSyn時,它就可以進入這個鎖對象關聯的所有代碼塊(這個例子中爲methodE)