爱妮不变

为了小妮的梦想而努力奋斗!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 14 文章 :: 13 评论 :: 0 Trackbacks

对于线程,在实际应用中我用的并不多,关键在于对线程的使用不是特别熟悉,现在抄个例子来复习复习。例子如下:

public class StaticBlock extends Object {
    
    
public static synchronized void staticA() {
        System.out.println(
"entering staticA()");

        
try {
            Thread.sleep(
5000);
        }
 catch (InterruptedException x) {
        }


        System.out.println(
"leaving staticA()");
    }


    
public static void staticB() {
        
        
synchronized (StaticBlock.class{
            System.out.println(
"in staticB() : inside sync block");

            
try {
                Thread.sleep(
2000);
            }
 catch (InterruptedException x) {
            }

        }

        System.out.println(
"leaving staticB() : outside sync block");
    }


    
public static void main(String[] args) {

        Runnable runB 
= new Runnable() {
            
public void run() {
                StaticBlock.staticB();
            }

        }
;

        Thread threadB 
= new Thread(runB, "B");
        threadB.start();
        
        Runnable runA 
= new Runnable() {
            
public void run() {
                StaticBlock.staticA();
            }

        }
;

        Thread threadA 
= new Thread(runA, "A");
        threadA.start();

        
try {
            Thread.sleep(
200);
        }
 catch (InterruptedException x) {
        }


    }

}


上面的例子中,print出来的4句代码先后顺序是怎样的呢?
是:
in staticB() : inside sync block
leaving staticB() : outside sync block
entering staticA()
leaving staticA()

还是
in staticB() : inside sync block
entering staticA()
leaving staticB() : outside sync block
leaving staticA()
其实,上面的两种可能都有。
先利用代码上复习下线程中的静态方法同步。
方法:staticA是一个静态方法,同时,也是一个同步方法。那说明对方法staticA同步即同步的是StaticBlock类。
staticB中使用了对StaticBlock类进行同步,也就是说,如果StaticBlock被调用了那么同步段的代码将不会立即执行,只有等到同步的StaticBlock类解锁后才会执行。并且执行的时候还会对StaticBlock这个类上锁。
由于方法staticB中同步块并没有包含“System.out.println("leaving staticB() : outside sync block");”这句代码。那也就是说,这句print代码并不在同步范围内。
结合例子来看,main方法中首先run的是threadB,这个时候StaticBlock类并没有被同步,因此,System.out.println("in staticB() : inside sync block");这句代码将被立即执行,接下来是sleep2秒钟,这时候main方法中的threadA也开始执行了。threadA访问的是静态同步方法staticA。这时候,静态同步方法被同步的是当前的这个类StaticBlock,由于staticB方法中同步块还在执行(因为2秒的sleep还未结束),因此threadA调用staticA方法还需等待。
当staticB中的同步块执行完了以后,staticA方法会马上被调用。这时候是staticA中的System.out.println("entering staticA()");先执行还是staticB中的System.out.println("leaving staticB() : outside sync block");先执行,这个就看运气了。两个都有可能先执行。
如果要staticB方法中的System.out.println("leaving staticB() : outside sync block");先执行,那么就可以将此句代码放入同步块中。
从这个例子中也可以看出:
1、线程同步必然是有多个线程在同时运行。
2、需要同步是因为多个线程在争抢资源。
3、需要被同步的是共享的资源,也就是多个线程争抢的。
4、对静态方法同步其实就是对当前类进行同步。
posted on 2008-08-22 11:44 李志洋 阅读(115) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: