黑马程序员技术交流社区

标题: Java 线程中synchronized 用法略解 [打印本页]

作者: pi408637535    时间: 2015-7-15 16:08
标题: Java 线程中synchronized 用法略解
很多时候我们查看博客发现synchronized 用于线程的同步但,实际用时却出了问题 如下:


  1. public class TestThread implements Runnable{
  2.        
  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub               
  5.                 for(int i = 0; i < 3; i++){
  6.                         Thread thread = new Thread(new TestThread());
  7.                         thread.setName(""+ i);
  8.                         thread.start();
  9.                 }
  10.         }

  11.         public TestThread() {
  12.                 // TODO Auto-generated constructor stub
  13.         }
  14.        
  15.         public void run(){
  16.                 Timer timer = new Timer();
  17.                 timer.test(Thread.currentThread().getName());
  18.         }
  19. }

  20. class Timer{
  21.          public synchronized void test(String str) {  
  22.         //                 synchronized(this){
  23.                 System.out.println( Thread.currentThread().getName() + '\t' + "test开始..");  
  24.                 try {  
  25.                     Thread.sleep(1000);  
  26.                 } catch (InterruptedException e) {  
  27.                     e.printStackTrace();  
  28.                 }  
  29.                 System.out.println( Thread.currentThread().getName() + '\t' + "test结束..");
  30.                          }
  31.         //    }  
  32. }
复制代码


输出的结果:
1        test开始..
2        test开始..
0        test开始..
0        test结束..
1        test结束..
2        test结束..
   这里不禁要范文,这个到底是哪里出了错误,原因在于:对于非static代码,synchronized锁住的是括号里的对象,对于static代码,锁住的是实例本身。 要想在非static代码中起到同步作用就应该在代码中加入该对象实例
  1. public void test() {  
  2.         synchronized (Sync.class) {  
  3.             System.out.println(Thread.currentThread().getName() + '\t' + "test开始..");  
  4.             try {  
  5.                 Thread.sleep(1000);  
  6.             } catch (InterruptedException e) {  
  7.                 e.printStackTrace();  
  8.             }  
  9.             System.out.println(Thread.currentThread().getName() + '\t' + "test结束..");  
  10.         }  
  11.     }  
复制代码

//这样就实现同步了(由于博客有字数限制所以只能尽量把主要代码罗列)
  我对synchronized关键字了解只限于此,希望看了不解的网络提出问题
作者: 耀阳圣尊    时间: 2015-7-15 16:42
总结的不错!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2