java lock锁住特定对象

2018-06-18 02:42:16来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

由于lock没有锁住特定对象的概念,该如何做到像synchronized同步块一样的效果呢?

答案:为每一个需要加锁的对像分配一把锁。

示例:

List<User> users = new ArrayList<>();

//同步某个对象
synchronized (users.get(0)) {
    
    //do something sync  
}

//同步某个对象对应的锁
users.get(0).lock.lock(); //加锁同步
try {

     //do something sync
}finally {
     users.get(0).lock.unlock();  //解锁
}

class User{

        /**
         * 给user对象分配一把锁
         */
        public Lock lock = new ReentrantLock();

        public int id;

        public String name;

}

 效率对比(机器:macOs10.12.5,i5处理器,8G内存)

//  thread_count  synchronized    lock
// 10 1-2ms 2-3ms
// 100 8-12ms 7-12ms
// 1000 68-94ms 64-85ms
// 10000 642-713ms 687-773ms
// 100000 5500ms 5600ms
// 1000000 54s 52s
可以看出效率几乎一样!所以,如果必须使用lock的情况下才使用它,否则还是synchronized关键字好,简单易懂。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java web用监听器listener简单的实现在线统计人数

下一篇:在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,