当一个线程进入一个synchronized方法后,其它线程是否可以进入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/taoshengyijiuzt/article/details/49971493

分两种情况

         1):进入此对象的非同步方法

              答案:可以

         2):进入此对象的同步方法

             答案:不可以

java中 synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。

第一种情况原代码

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  *  
  3.  */  
  4. package thread;  
  5.   
  6.   
  7. /** 
  8.  * @author Administrator 
  9.  * 
  10.  */  
  11. public class TestClass {  
  12.     /** 
  13.      * @param args 
  14.      */  
  15.     public static void main(String[] args) {  
  16.         TestClass tc = new TestClass();  
  17.         Thread1 t1 = tc.new Thread1(tc);  
  18.         t1.start();  
  19.         Thread2 t2 = tc.new Thread2(tc);  
  20.         t2.start();  
  21.           
  22.     }  
  23.   
  24.     class Thread1 extends Thread{  
  25.         TestClass tc = null;  
  26.         public Thread1(TestClass tc) {  
  27.             this.tc = tc;  
  28.         }  
  29.         @Override  
  30.         public void run() {  
  31.             tc.method1();  
  32.         }  
  33.     }  
  34.     class Thread2 extends Thread{  
  35.         TestClass tc = null;  
  36.         public Thread2(TestClass tc) {  
  37.             this.tc = tc;  
  38.         }  
  39.         @Override  
  40.         public void run() {  
  41.             // TODO Auto-generated method stub  
  42.             tc.method2();  
  43.         }  
  44.     }  
  45.       
  46.     public synchronized void method1(){  
  47.         System.out.println("method1");  
  48.         try {  
  49.             Thread.sleep(1000*10);  
  50.         } catch (InterruptedException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.       
  54.     }  
  55.     public  void method2(){  
  56.         System.out.println("method2");  
  57.     }  
  58. }  



第二种情况原代码

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  *  
  3.  */  
  4. package thread;  
  5.   
  6.   
  7. /** 
  8.  * @author Administrator 
  9.  * 
  10.  */  
  11. public class TestClass {  
  12.     /** 
  13.      * @param args 
  14.      */  
  15.     public static void main(String[] args) {  
  16.         TestClass tc = new TestClass();  
  17.         Thread1 t1 = tc.new Thread1(tc);  
  18.         t1.start();  
  19.         Thread2 t2 = tc.new Thread2(tc);  
  20.         t2.start();  
  21.           
  22.     }  
  23.   
  24.     class Thread1 extends Thread{  
  25.         TestClass tc = null;  
  26.         public Thread1(TestClass tc) {  
  27.             this.tc = tc;  
  28.         }  
  29.         @Override  
  30.         public void run() {  
  31.             tc.method1();  
  32.         }  
  33.     }  
  34.     class Thread2 extends Thread{  
  35.         TestClass tc = null;  
  36.         public Thread2(TestClass tc) {  
  37.             this.tc = tc;  
  38.         }  
  39.         @Override  
  40.         public void run() {  
  41.             // TODO Auto-generated method stub  
  42.             tc.method2();  
  43.         }  
  44.     }  
  45.       
  46.     public synchronized void method1(){  
  47.         System.out.println("method1");  
  48.         try {  
  49.             Thread.sleep(1000*10);  
  50.         } catch (InterruptedException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54.     public synchronized void method2(){  
  55.         System.out.println("method2");  
  56.     }  
  57. }  
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页