Skypine_Lee的专栏

自己选择的路 跪着也要走完

Android学习 (七)synchronized(一)(转)

转自: http://hi.baidu.com/fenghuang1207/blog/item/06a17dce8534ff1d93457e21.html


  synchronized:Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

    一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

    二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

    三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

    四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

    五、以上规则对其它对象锁同样适用.

举例说明:  
    一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

package ths;

public class Thread1 implements Runnable{  
    public void run() {  
         synchronized(this) {  
              for (int i = 0; i < 5; i++){  
                   System.out.println(Thread.currentThread().getName() + "synchronized loop " +i);  
              }  
         }  
    }  
    public static void main(String[] args){  
         Thread1 t1 = newThread1();  
         Thread ta = new Thread(t1,"A");  
         Thread tb = new Thread(t1,"B");  
         ta.start();  
         tb.start();  
    } 
}

结果:  
    A synchronized loop 0  
    A synchronized loop 1  
    A synchronized loop 2  
    A synchronized loop 3  
    A synchronized loop 4  
    B synchronized loop 0  
    B synchronized loop 1  
    B synchronized loop 2  
    B synchronized loop 3  
    B synchronized loop 4

    二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

package ths;

public class Thread2{  
    public void m4t1() {  
         synchronized(this) {  
              int i = 5;  
              while( i-- > 0){  
                   System.out.println(Thread.currentThread().getName() + " : " +i);  
                   try {  
                        Thread.sleep(500);  
                   } catch (InterruptedException ie){  
                   }  
              }  
         }  
    }  
    public void m4t2() {  
         int i = 5;  
         while( i-- > 0){  
              System.out.println(Thread.currentThread().getName() + " : " +i);  
              try { 

阅读更多
个人分类: Java
想对作者说点什么? 我来说一句

SynchorizedDemo

2012年07月11日 681KB 下载

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

不良信息举报

Android学习 (七)synchronized(一)(转)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭