java lock锁住特定对象

由于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关键字好,简单易懂。
原文地址:https://www.cnblogs.com/hdwang/p/8608665.html