- 爱易网页
 
                        - 
                            Java教程
 
                        - (札记)J2EE中的同步和异步 
 
                         
                    
                    
                    日期:2014-05-19  浏览次数:20880 次 
                    
                        
                         (笔记)J2EE中的同步和异步
    在学习java过程中很多人对同步(Synchronized)和异步(Asyschronized)的概念不甚理解,以下是个人对Synchronized& Asynthronized的解释(仅供产考):
sleep() vs wait() 
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 
Synchronized同步:一个程序运行后,另一个程序才运行(顺序执行)
Asynchronized异步:一个程序运行,另一个程序也在运行,互补干扰(混乱执行)
package SynTest;
public class Synchronized {
	/** 
	* @author Daniel
	*/ 
//非同步 
	static void method(Thread thread){ 
	        System.out.println("begin "+thread.getName()); 
	        try{ 
	        	Thread.sleep(2000); 
	        }catch(Exception ex){ 
	        	ex.printStackTrace(); 
	        } 
	        System.out.println("end "+thread.getName()); 
	    } 
//同步方式一:同步方法 
synchronized static void method1(Thread thread){//这个方法是同步的方法,每次只有一个线程可以进来 
	System.out.println("begin "+thread.getName()); 
    try{ 
    Thread.sleep(200000); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
    System.out.println("end "+thread.getName()); 
   } 
//同步方式二:同步代码块 
static void method2(Thread thread){ 
    synchronized(Synchronized.class) { 
    System.out.println("begin "+thread.getName()); 
    try{          
    	Thread.sleep(2000); 
        }catch(Exception ex){ 
          ex.printStackTrace(); 
        } 
        System.out.println("end "+thread.getName()); 
 } 
} 
//同步方式三:使用同步对象锁 
private static Object _lock1=new Object(); 
private static byte _lock2[]={};//据说,此锁更可提高性能。源于:锁的对象越小越好 
static void method3(Thread thread){ 
    synchronized(_lock1) { 
    System.out.println("begin "+thread.getName()); 
    try{ 
          Thread.sleep(2000); 
        }catch(Exception ex){ 
          ex.printStackTrace(); 
        } 
        System.out.println("end "+thread.getName()); 
    } 
} 
public static void main(String[] args){ 
    //启动3个线程,这里用了匿名类 
   for(int i=0;i<3;i++){ 
         new Thread(){ 
             public void run(){ 
//               method(this); 
//               method1(this); 
//              method2(this); 
              method3(this); 
             } 
         }.start(); 
     } 
 } 
}