内在锁、客户端锁和外在锁有什么区别?
创建线程安全类的最佳方法是什么?
哪种类型的锁更受欢迎,为什么?
内在锁、客户端锁和外在锁有什么区别?
创建线程安全类的最佳方法是什么?
哪种类型的锁更受欢迎,为什么?
客户端锁定,如果我理解的正确的话,是指不同的东西。当你没有线程安全的类时,你的客户端需要负责这个。他们需要持有锁以确保没有任何竞争条件。
外部锁定是使用显式锁来代替内置机制的同步块,它给你隐式锁以便专门使用显式锁定。这是一种更为复杂的锁定方式。它有许多优点(例如,您可以设置优先级)。一个好的起点是java documentation about locks。
问题2:这取决于情况:) 对我来说最简单的方法是尽量使所有东西都不可变。当某些东西是不可变的时候,我就不需要再担心线程安全性了。
问题3: 我在你的第一个问题中回答了。
显式锁 - 使用并发锁定实用程序(例如Lock接口),例如- ConcurrentHashMap
内部锁 - 使用synchronized
关键字进行锁定。
客户端锁定 - 类似于ConcurrentHashMap
的类不支持客户端锁定,因为get方法没有使用任何类型的锁。因此,即使您在其对象上放置锁,例如synchronized(ConcurrentHashMap
对象),仍然可以访问ConcurrentHashMap
的对象的其他某些线程。
所有设置get方法明确或内部锁的类都支持客户端锁定。当一些客户端代码来锁定该对象时。下面是Vector的示例:
public static Object getLast(Vector list) {
synchronized (list) {
int lastIndex = list.size() - 1;
return list.get(lastIndex);
}
}
public static void deleteLast(Vector list) {
synchronized (list) {
int lastIndex = list.size() - 1;
list.remove(lastIndex);
}
}
以下是一些讨论不同锁定方案的链接:
我不知道创建线程安全类的“最佳”方法是什么,这取决于您要实现的具体目标。通常情况下,您不必使整个类都线程安全,只需保护不同线程都可以访问的资源,如公共列表等。