要求是只允许单线程执行用户管理(创建/更新/导入)操作,但不允许多个线程同时为同一用户执行用户操作.例如,当线程A创建用户A时,同时不允许线程B导入用户A或创建用户A但允许线程B导入用户B.以下代码线程是否可以满足这些要求?
public class UserManagement {
ConcurrentHashMap<Integer, Lock> userLock = new ConcurrentHashMap<>();
public void createUser(User user, Integer userId) {
Lock lock = userLock.putIfAbsent(userId, new ReentrantLock());
try {
lock.lock();
//create user logic
} finally {
lock.unlock();
}
}
public void importUser(User user, Integer userId) {
Lock lock = userLock.putIfAbsent(userId, new ReentrantLock());
try {
lock.lock();
//import user logic
} finally {
lock.unlock();
}
}
public void updateUser(User user, Integer userId) {
Lock lock = userLock.putIfAbsent(userId, new ReentrantLock());
try {
lock.lock();
// update user …Run Code Online (Sandbox Code Playgroud) 如果有人能够帮助我找到方法同步和对象同步之间的不同之处的真实例子,那就太好了.
方法同步示例
public class MyClassExample {
private int i;
public synchronized void increment(){
i = i + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
对象同步示例
public class MyClassExample {
private int i;
Object writeLock = new Object();
public void increment(){
synchronized(writeLock) {
i = i + 1;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想在我的项目中定义泛型静态方法.要求是方法返回类型是方法参数之一.
以下是我的解决方案.
public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) {
List<T> list = null;
if (attrClass.equals(String.class)) {
list = (List<T>) new ArrayList<String>();
list.add(attr);
} else if (attrClass.equals(Integer.class)) {
list = (List<T>)new ArrayList<Integer>();
list.add(attr);
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题.
基本上我想知道当前有多少线程正在使用该对象.如果没有人使用此对象引用,那么我想销毁此对象.
例
User u = new User();
(here I have other code)
if (u is not used by any thread) {
u = null;
}
Run Code Online (Sandbox Code Playgroud)