接上篇,是由一个对象来访问多个线程,这时只需要将方法加上synchronized即可实现,但是如果由多个对象来调多个线程,会是什么情况,如下
public class SychronizeTest {
public static void main(String[] args) {
Task t = new Task();
ThreadA ta = new ThreadA(t);
t = new Task(); //生成第二个对象
ThreadB tb = new ThreadB(t);
ta.start();
tb.start();
}
}
你可以尝试执行一个结果,肯定是乱序的。 这种情况就需要加一个类级别的锁
class Task {
public synchronized static void excute1(String threadName) {
for (int i = 0; i <= 20; i++) {
System.out.println(threadName + " ------ " + i);
}
}
public synchronized static void excute2(String threadName){
for (int i = 0; i <= 20; i++) {
System.out.println(threadName + " ------ " + i);
}
}
}
当synchronized 与static共用时,这个时候,锁的级别不在对象上,而在对象所对应的类上,即使你重新生成 N个对象,在JAVA中,这些对象会对应唯一一个class对象,所以通过上面的方法,可以按照顺序,执行完一个,再执行另一个。