Jan28

【学习笔记】java静态锁和实例锁的区别

Author: leeon  Click: 6607   Date: 2014.01.28 @ 21:17:43 pm Category: java

在java中synchronized同步关键字可以使用在静态方法和实例方法中使用,两者的区别在于:

静态锁:  在静态方法前面加上synchronized方法表示锁定此类,当多个线程调用这个类中的静态方法时会阻塞。

实例锁: 在实例方法前面加上synchronized方法表示锁定类的单个实例,当多个线程调用一个类申明的同一个实例的实例方法是会阻塞。

例如一个类func中有如下方法静态方法:


class func{
public synchronized static void staticFuncA() throws InterruptedException{
TimeUnit.SECONDS.sleep(2);
System.out.println("This thread is "+Thread.currentThread().getName());
}

public synchronized static void staticFuncB() throws InterruptedException{
TimeUnit.SECONDS.sleep(2);
System.out.println("static func b");

}

public static void staticFunC(){
System.out.println("static fun c");
}


public synchronized void funcD() throws InterruptedException{
Thread.sleep(2000);
System.out.println("func d");
}

public synchronized void funcE() throws InterruptedException{
Thread.sleep(2000);
System.out.println("func e");
}

}

当多个线程都需要执行staticFuncA或staticFuncB方法时,当某一个线程抢占到静态锁的方法,其他线程都会在调用静态锁方法时被阻塞并等待抢占到静态锁方法的线程执行完毕。而不具有静态锁特性的静态方法staticFunC就不受锁的影响,可以随意执行而不会被阻塞。总结: 静态锁是对全局带有synchronized的静态方法产生影响。

而在实例锁中,实例方法的同步是在多个线程调用同一个对象时受到锁的控制,并且和静态方法一样,同样会影响到所有非静态具有synchronized的方法。但静态锁和实例锁两者间的同步并不会受到互相干扰,也就是说线程调用staticFunB并不会影响到其他线程调用funcE。



TAG:   静态锁 java

    评论
    • 提交

    分类

    标签

    归档

    最新评论

    Abyss在00:04:28评论了
    Linux中ramdisk,tmpfs,ramfs的介绍与性能测试
    shallwe99在10:21:17评论了
    【原创】如何在微信小程序开发中正确的使用vant ui组件
    默一在09:04:53评论了
    Berkeley DB 由浅入深【转自架构师杨建】
    Memory在14:09:22评论了
    【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)
    leo在17:57:04评论了
    shell中使用while循环ssh的注意事项

    我看过的书

    链接

    其他

    访问本站种子 本站平均热度:8823 c° 本站链接数:1 个 本站标签数:464 个 本站被评论次数:94 次