打个比喻:
有2个账户int x=1;
int y=2;有1个方法是取货:/**
* 提取货物
* @param id
* 提取人的id号
*/
public void getObject(int id){
// ... ...
}要求:当2个人同时各自拿着不同的账号去取货时(即,2个线程同时调用getObject方法)
可以同时为2个人取货(即:getObject()方法可以支持多线程调用)当2个人同时拿着同一个账号去取货时(即,2个线程同时调用getObject方法)
就必须排队第一个取好了第二个再取 (即:getObject()方法可以不支持多线程 synchronized 效果 )
有2个账户int x=1;
int y=2;有1个方法是取货:/**
* 提取货物
* @param id
* 提取人的id号
*/
public void getObject(int id){
// ... ...
}要求:当2个人同时各自拿着不同的账号去取货时(即,2个线程同时调用getObject方法)
可以同时为2个人取货(即:getObject()方法可以支持多线程调用)当2个人同时拿着同一个账号去取货时(即,2个线程同时调用getObject方法)
就必须排队第一个取好了第二个再取 (即:getObject()方法可以不支持多线程 synchronized 效果 )
getObject()方法把那个属性锁起来就行了
就必须排队第一个取好了第二个再取 (即:getObject()方法可以不支持多线程 synchronized 效果 )这个你就必须自己建个锁,自己维护。如果你的
public void getObject(int id){
// ... ...
}
操作不耗时的话,建议还是对id进行加锁,这样不容易出错。如果getObject(int id)方法耗时 你可以在进行实质上操作的时候加锁
只能在public void getObject(int id)方法内进行操作还有1楼的Account类是干嘛用的 能说明并展示简单示例代码吗?
Object accountLock2 = new Object();public void getObject(int id){
Ojbect lock = null;
if (id == 1)
lock = accountLock1;
else if (id == 2)
lock = accountLock2;
synchronized(lock) {
//........
}
}
每个人来必须持有一个账户,线程就锁定这个账户就可以了
如果不同的账户相互之间拿货不会有干扰
如果两个相同的账户就会产生同步,就是一个先拿,拿完了后面的才能拿
HashMap<Integer,Object> locks = new HashMap<Integer,Object>();
{
locks.put(1,new Object());
locks.put(2,new Object());
}public void getObject(int id){
synchronized(locks.get(id)){
//
}
}
但是... 如果账号有成千上万个 不可能写几万的IF吧8楼的朋友 Account 是什么类?? java里面(JDK1.6)找不到 是J2SE吗??
请写些简单的代码来表示好吗 谢谢10楼的和6楼的其实差不多
public class Test extends Thread { @Override
public void run() {
while (true) {
getObject((int) (Math.random() * 100));
getObject(1000);
}
} public void getObject(int id) {
String lock = String.valueOf(id).intern();
synchronized (lock) {
System.out.printf("%s: %d START%n", getName(), id);
try {
sleep(500);
} catch (InterruptedException e) {
}
System.out.printf("%s: %d END%n", getName(), id);
}
} public static void main(String[] args) throws Exception {
new Test().start();
new Test().start();
new Test().start();
}
}