黑马程序员技术交流社区
标题:
Java 线程中synchronized 用法略解
[打印本页]
作者:
pi408637535
时间:
2015-7-15 16:08
标题:
Java 线程中synchronized 用法略解
很多时候我们查看博客发现synchronized 用于线程的同步但,实际用时却出了问题 如下:
public class TestThread implements Runnable{
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0; i < 3; i++){
Thread thread = new Thread(new TestThread());
thread.setName(""+ i);
thread.start();
}
}
public TestThread() {
// TODO Auto-generated constructor stub
}
public void run(){
Timer timer = new Timer();
timer.test(Thread.currentThread().getName());
}
}
class Timer{
public synchronized void test(String str) {
// synchronized(this){
System.out.println( Thread.currentThread().getName() + '\t' + "test开始..");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName() + '\t' + "test结束..");
}
// }
}
复制代码
输出的结果:
1 test开始..
2 test开始..
0 test开始..
0 test结束..
1 test结束..
2 test结束..
这里不禁要范文,这个到底是哪里出了错误,原因在于:对于非static代码,synchronized锁住的是括号里的对象,对于static代码,锁住的是实例本身。 要想在非static代码中起到同步作用就应该在代码中加入该对象实例
public void test() {
synchronized (Sync.class) {
System.out.println(Thread.currentThread().getName() + '\t' + "test开始..");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + '\t' + "test结束..");
}
}
复制代码
//这样就实现同步了(由于博客有字数限制所以只能尽量把主要代码罗列)
我对synchronized关键字了解只限于此,希望看了不解的网络提出问题
作者:
耀阳圣尊
时间:
2015-7-15 16:42
总结的不错!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2