........
}
这样,只在一个线和进个方法,那么此 “类”(方法所在的类) 就会被"上锁",其它线程不能访问。直到这个线程释放资源为止。
还可以将要实现同步的代码写到一个synchronized块里面,如:synchronized(obj){
......
}
注意,此处的obj是一个对象,你可以Object obj = new Object() 也可以用this来代替,表示当前对象!
先上结论:两个线程访问不同对象中不同的synchronized方法不会受到synchronized的限制。
程序运行结果之所以这样,原因在于run()方法的实现导致的。
线程1中,先调用m.test1(),接着Thread.sleep(1000)
线程2中,先Thread.sleep(1000),接着调用m.test2()
主程序中,线程1与2都有可能先开始,无论谁先开始,结果都是线程1中m.test1()先结束,线程2中m.test2()后结束。
因为轮到线程2时,先Thread.sleep(1000),将资源让给线程1
改进方法,应该在打印时,让线程sleep
class Test{synchronized public void test1(){
for(int p = 0 p < 5 p++){
try {
Thread.sleep(500)
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
System.out.println("s1.run.TestSynchronized_test 1")
}
}
synchronized public void test2(){
for(int p = 0 p < 5 p++){
try {
Thread.sleep(500)
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
System.out.println("s2.run.TestSynchronized_test 2")
}
}
}
run()方法中直接调用即可
class TestSynchronized_1 implements Runnable{private Test m
public TestSynchronized_1(Test m){
this.m = m
}
public void run(){
m.test1()
}
}
class TestSynchronized_2 implements Runnable{
private Test m
public TestSynchronized_2(Test m){
this.m = m
}
public void run(){
m.test2()
}
}
输出结果如下:
s2.run.TestSynchronized_test 2
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2