java线程问题,请高手帮忙

kkctf 2010-06-11 12:06:14
打个比喻:
有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 效果 )
...全文
207 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2010-06-13
  • 打赏
  • 举报
回复
就写了一个class,具体困难更楼主不太一样,重点在于synchronized(intern字符串)
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();
}
}
kkctf 2010-06-13
  • 打赏
  • 举报
回复
6楼的朋友虽然能够决绝问题
但是... 如果账号有成千上万个 不可能写几万的IF吧

8楼的朋友 Account 是什么类?? java里面(JDK1.6)找不到 是J2SE吗??
请写些简单的代码来表示好吗 谢谢

10楼的和6楼的其实差不多
wangcfxbg 2010-06-12
  • 打赏
  • 举报
回复
比如blockingqueue
wangcfxbg 2010-06-12
  • 打赏
  • 举报
回复
不能同步方法,那就同步块,同步对象,或者用线程安全的类来操作。
kkctf 2010-06-11
  • 打赏
  • 举报
回复
一个账户一把锁,不同账户不同锁 ??

大部分的好像都怎么说 能给个简单的示例代码吗?
只能在public void getObject(int id)方法内进行操作

还有1楼的Account类是干嘛用的 能说明并展示简单示例代码吗?
truediego 2010-06-11
  • 打赏
  • 举报
回复
一个账户一把锁,不同账户不同锁
chanxue 2010-06-11
  • 打赏
  • 举报
回复
每一个id对应一个唯一的账户,方法里面直接锁定账户就可以了
xierangh 2010-06-11
  • 打赏
  • 举报
回复
当2个人同时拿着同一个账号去取货时(即,2个线程同时调用getObject方法)
就必须排队第一个取好了第二个再取 (即:getObject()方法可以不支持多线程 synchronized 效果 )

这个你就必须自己建个锁,自己维护。

如果你的
public void getObject(int id){
// ... ...
}
操作不耗时的话,建议还是对id进行加锁,这样不容易出错。

如果getObject(int id)方法耗时 你可以在进行实质上操作的时候加锁
lacus87 2010-06-11
  • 打赏
  • 举报
回复
你提货那个方法的类里面增加一个Account类的属性
getObject()方法把那个属性锁起来就行了
「已注销」 2010-06-11
  • 打赏
  • 举报
回复

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)){
//
}
}
mdc1994 2010-06-11
  • 打赏
  • 举报
回复
方法上加上同步锁吧.
lacus87 2010-06-11
  • 打赏
  • 举报
回复
Account类就是用户用来提取货物的账户类,
每个人来必须持有一个账户,线程就锁定这个账户就可以了
如果不同的账户相互之间拿货不会有干扰
如果两个相同的账户就会产生同步,就是一个先拿,拿完了后面的才能拿
weskiter40 2010-06-11
  • 打赏
  • 举报
回复
ding
truediego 2010-06-11
  • 打赏
  • 举报
回复
大意

Object accountLock1 = new Object();
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) {
//........
}
}

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧