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进行同步后: