synchronized
注意:在一個類中,不管有幾個方法進行了同步(synchronized),這些同步方法都共有一把鎖,只要一個線程獲得了這個對象鎖,其他的線程就不能訪問該對象的任何一個同步方法,但是可以訪問其他的非同步方法;
synchronized可重入機制:
即在一個 synchronized 方法/塊的內部調用本類的其他 synchronized 方法/塊時,是永遠可以得到鎖的;
synchronized實現任務的順序執行示例:
Main.java
package com.shunxu;
/**
* @Auther: 13213
* @Date: 2020/5/30 17:10
* @Description:
*/
public class Main {
synchronized public void serviceMethod(){
try {
System.out.println("init main 下一步 sleep begin ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("init main 下一步 sleep end ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Sub.java
package com.shunxu;
/**
* @Auther: 13213
* @Date: 2020/5/30 17:15
* @Description:
*/
public class Sub extends Main{
@Override
public void serviceMethod() {
try {
System.out.println("init sub 下一步 sleep begin ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("init sub 下一步 sleep end ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
super.serviceMethod();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyThreadA,java
package com.shunxu;
/**
* @Auther: 13213
* @Date: 2020/5/30 17:17
* @Description:
*/
public class MyThreadA extends Thread{
private Sub sub;
public MyThreadA(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run(){
sub.serviceMethod();
}
}
MyThreadB.java
package com.shunxu;
/**
* @Auther: 13213
* @Date: 2020/5/30 17:21
* @Description:
*/
public class MyThreadB extends Thread{
private Sub sub;
public MyThreadB(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run(){
sub.serviceMethod();
}
}
Test.java
package com.shunxu;
/**
* @Auther: 13213
* @Date: 2020/5/30 17:22
* @Description:
*/
public class Test {
public static void main(String[] args) {
Sub sub = new Sub();
MyThreadA a = new MyThreadA(sub);
a.setName("A");
a.start();
MyThreadB b = new MyThreadB(sub);
b.setName("B");
b.start();
}
}
運行結果:
將子類中的方法加關鍵字synchronized進行同步後: