欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java lock锁住特定对象

程序员文章站 2022-03-15 12:13:05
由于lock没有锁住特定对象的概念,该如何做到像synchronized同步块一样的效果呢? 答案:为每一个需要加锁的对像分配一把锁。 示例: 效率对比(机器:macOs10.12.5,i5处理器,8G内存) ......

由于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关键字好,简单易懂。