来源玉

来源:互联网 发布:win10改不了mac地址 编辑:程序博客网 时间:2024/04/27 18:32
[java] view plaincopyprint?
  1. package com.jadyer.thread.sync;  
  2.   
  3. /** 
  4.  * Synchronized Static Method Test 
  5.  * @see 说明:如果某个synchronized方法是static的 
  6.  * @see      那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是该方法所在的对象所对应的Class对象 
  7.  * @see      因为Java中无论一个类有多少个对象,这些对象都会对应唯一的一个Class对象 
  8.  * @see      因此当线程分别访问同一个类的两个对象的两个static的synchronized方法时,它们的执行顺序也是顺序执行的 
  9.  * @see      即一个线程先执行一个static的synchronized方法,执行完毕后,另一个线程才开始执行另一个static的synchronized方法 
  10.  * @see 总结:重点在于判断synchronized锁的是谁。如果该方法是静态的,则锁Class对象,否则锁的就是当前对象 
  11.  * @author 宏宇 
  12.  * @create Feb 21, 2012 5:29:39 PM 
  13.  */  
  14. public class SynchronizedStaticTest {  
  15.     public static void main(String[] args) {  
  16.         Bank bank = new Bank();  
  17.           
  18.         Thread tt11 = new Thread(new ThreadRMB(bank));  
  19.         Thread tt22 = new Thread(new ThreadDollar(bank));  
  20.           
  21.         tt11.start();  
  22.         tt22.start();  
  23.     }  
  24. }  
  25.   
  26.   
  27. class ThreadRMB implements Runnable{  
  28.     private Bank bank;  
  29.     public ThreadRMB(Bank bank){  
  30.         this.bank = bank;  
  31.     }  
  32.     @Override  
  33.     public void run() {  
  34.         bank.getRMB();  
  35.     }  
  36. }  
  37.   
  38.   
  39. class ThreadDollar implements Runnable{  
  40.     private Bank bank;  
  41.     public ThreadDollar(Bank bank){  
  42.         this.bank = bank;  
  43.     }  
  44.     @Override  
  45.     public void run() {  
  46.         bank.getDollar();  
  47.     }  
  48. }  
  49.   
  50.   
  51. class Bank{  
  52.     //如要验证synchronized锁同一个类的对象,和锁它的Class对象的区别  
  53.     //可去掉static关键字,再查看控制台打印,即public synchronized void getRMB()  
  54.     public synchronized static void getRMB(){  
  55.         for(int i=0; i<20; i++){  
  56.             try {  
  57.                 Thread.sleep((long)(Math.random()*1000));  
  58.             } catch (InterruptedException e) {  
  59.                 e.printStackTrace();  
  60.             }  
  61.             System.out.println(Thread.currentThread().getName() + ":" + i);  
  62.         }  
  63.     }  
  64.       
  65.     public synchronized static void getDollar(){  
  66.         for(int i=0; i<20; i++){  
  67.             try {  
  68.                 Thread.sleep((long)(Math.random()*1000));  
  69.             } catch (InterruptedException e) {  
  70.                 e.printStackTrace();  
  71.             }  
  72.             System.out.println(Thread.currentThread().getName() + ":" + i);  
  73.         }  
  74.     }  


  1. package com.jadyer.thread.sync;  
  2.   
  3. /** 
  4.  * Synchronized Block Test 
  5.  * @author 宏宇 
  6.  * @create Feb 21, 2012 5:29:39 PM 
  7.  */  
  8. public class SynchronizedBlockTest {  
  9.     public static void main(String[] args) {  
  10.         Bank bank = new Bank();  
  11.           
  12.         Thread tt11 = new Thread(new ThreadRMB(bank));  
  13.           
  14.         //如果要验证synchronized(this)锁的是当前类的对象,而非当前类的Class对象  
  15.         //则可取消注释该行代码,再观察控制台打印效果。效果应该是两个线程并发执行的输出  
  16.         //bank = new Bank();  
  17.           
  18.         Thread tt22 = new Thread(new ThreadDollar(bank));  
  19.           
  20.         tt11.start();  
  21.         tt22.start();  
  22.     }  
  23. }  
  24.   
  25.   
  26. class ThreadRMB implements Runnable{  
  27.     private Bank bank;  
  28.     public ThreadRMB(Bank bank){  
  29.         this.bank = bank;  
  30.     }  
  31.     @Override  
  32.     public void run() {  
  33.         bank.getRMB();  
  34.     }  
  35. }  
  36.   
  37.   
  38. class ThreadDollar implements Runnable{  
  39.     private Bank bank;  
  40.     public ThreadDollar(Bank bank){  
  41.         this.bank = bank;  
  42.     }  
  43.     @Override  
  44.     public void run() {  
  45.         bank.getDollar();  
  46.     }  
  47. }  
  48.   
  49.   
  50. /** 
  51.  * Bank 
  52.  * @see 说明:synchronized块的写法:synchronized(object){//TODO...},它表示线程在执行的时候,会对object对象上锁 
  53.  * @see      通常会把java.lang.Object对象传进来,事实上这里可以传进来任何的对象 
  54.  * @see      因为它是一个没有实际作用的对象,其仅仅起到锁的作用,就像一个标识一样 
  55.  * @see 作用:它表示,如果线程能够进入到这里,即执行到这里,那么,就将object对象锁上 
  56.  * @see      如果另一个线程也执行到这里,发现object对象已上锁,则会等待其解锁后,才会去执行synchronized块里面的代码 
  57.  * @see 补充:synchronized(this)表示对当前类的对象上锁。注意,它锁的不是当前类的Class对象 
  58.  * @see      synchronized(Bank.class)表示对当前类的Class对象上锁 
  59.  * @author 宏宇 
  60.  * @create Feb 22, 2012 2:29:16 AM 
  61.  */  
  62. class Bank{  
  63.     private Object obj11 = new Object();  
  64.     private Object obj22 = new Object();  
  65.       
  66.     public void getRMB(){  
  67.         //synchronized(obj11){  
  68.         synchronized (Bank.class) {  
  69.             for(int i=0; i<20; i++){  
  70.                 try {  
  71.                     Thread.sleep((long)(Math.random()*1000));  
  72.                 } catch (InterruptedException e) {  
  73.                     e.printStackTrace();  
  74.                 }  
  75.                 System.out.println(Thread.currentThread().getName() + ":" + i);  
  76.             }  
  77.         }  
  78.     }  
  79.       
  80.     public void getDollar(){  
  81.         //synchronized(obj11){  
  82.         //synchronized(obj22){  
  83.         synchronized (this) {  
  84.             for(int i=0; i<20; i++){  
  85.                 try {  
  86.                     Thread.sleep((long)(Math.random()*1000));  
  87.                 } catch (InterruptedException e) {  
  88.                     e.printStackTrace();  
  89.                 }  
  90.                 System.out.println(Thread.currentThread().getName() + ":" + i);  
  91.             }  
  92.         }  
  93.     }  



原创粉丝点击