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

相关文章:

  • 2022-01-01
  • 2022-12-23
  • 2021-09-02
  • 2022-12-23
  • 2021-07-10
  • 2022-12-23
  • 2022-12-23
  • 2021-07-30
猜你喜欢
  • 2022-01-04
  • 2022-01-05
  • 2022-12-23
  • 2021-07-31
  • 2022-02-18
  • 2021-10-12
相关资源
相似解决方案