又一个多线程同步问题 标题一定要长 .............................................................

Kanepan 2010-07-07 04:17:23
每个线程中有个私有属性id
怎样保证id相同的时候,做一段代码同步(比如数据库操作)。
而id不同的时候又能异步。
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kanepan 2010-07-08
  • 打赏
  • 举报
回复
之前我还真不知道 Integer 就能当做共享的数据直接锁..
要不然也不会走上面的弯路的。
俊哥123 2010-07-08
  • 打赏
  • 举报
回复
楼主,你的代码实现方式很诡异,
是我太落后呢,还是你太超前呢。。。。
Kanepan 2010-07-08
  • 打赏
  • 举报
回复
不错
LS的代码,省了不少
「已注销」 2010-07-08
  • 打赏
  • 举报
回复

class ThreadTest extends Thread {
final private Integer ID;

private ThreadTest(Integer id) {
super();
ID = id;
}

public void run() {
synchronized (ID) {
// do sth here;
}
}
}
Kanepan 2010-07-08
  • 打赏
  • 举报
回复
按3L 意思写了段子代码

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class Test {
private static ConcurrentMap<Integer, Object> map = new ConcurrentHashMap<Integer, Object>();

public static void main(String[] args) throws InterruptedException {
// Random r = new Random();
// for (int i = 0; i < 10; i++) {
// new T(r.nextInt(10)).start();
// }
new ThreadTest(1).start();
new ThreadTest(1).start();
new ThreadTest(2).start();
new ThreadTest(2).start();
}


static class ThreadTest extends Thread {
private int id;

public ThreadTest(int id) {
this.id = id;
}

public void run() {
if (hasId()) {
System.out.println("sync......");
}
synchronized (map.get(id)) {
doSomeThing();
}
map.remove(id);
}

private boolean hasId() {
synchronized (map) {
if (!map.containsKey(id)) {
Object lock = new Object();
map.put(id, lock);
return false;
}
return true;
}
}

void doSomeThing() {
try {
System.out.println(id + " doing something .....");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


跑是能跑起来了,看看有没有更好的办法或者另外的好思路。
leisore 2010-07-07
  • 打赏
  • 举报
回复
没明白lz的意图 :(
Kanepan 2010-07-07
  • 打赏
  • 举报
回复
谢谢 回复的朋友们
3L的方法,可以考虑放在内存中,效率比较高
但是好像满足不了“id不同的时候又能异步”的要求把?
prince_java 2010-07-07
  • 打赏
  • 举报
回复
加锁就行了,线程锁主要是防止对同一个对象同时操作造成异常,只要对象不同,也就是你所说的ID不同,它还是会进行异步操作
cooljia 2010-07-07
  • 打赏
  • 举报
回复
拍脑袋一个做法,也许不是最好的,抛砖引玉:
首先,你这个私有变量要在线程间共享访问到,因为所有其他线程需要知道自己的这个私有变量是否和其他人一致,我建议在数据库中单独建立一个表,每个线程在表中维护自己的变量,并且其他线程可以通过对这个表的操作得到其他线程的变量值。


其次,最最简单的不耗脑筋的做法就有了
if (all value is the same) {
synchronized(lock){
methodxx();
}
}
else {
methodxx();
}

private methodxx(){
//将你的业务方法全部写在这里
}

楼主你觉得如何?
Kanepan 2010-07-07
  • 打赏
  • 举报
回复
数据库操作中有涉及到许多表的操作.. 用的数据库还不支持事务...
能不能在程序上做同步操作?
dr_lou 2010-07-07
  • 打赏
  • 举报
回复
不需要ID吧,对你的数据库操作同步即可啊。

62,614

社区成员

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

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