JAVA多线程中的synchronized(obj)到底怎么用?

Python013

JAVA多线程中的synchronized(obj)到底怎么用?,第1张

你可以直接用synchronized来修饰一个方法,如:public void synchronized printXX(){

........

}

这样,只在一个线和进个方法,那么此 “类”(方法所在的类) 就会被"上锁",其它线程不能访问。直到这个线程释放资源为止。

还可以将要实现同步的代码写到一个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