多线程同步问题

wula0010 2011-01-25 12:41:44
代码如下,pro是操作文件读写的对象,多线程运行时发现,操作并没有同步,请帮助看看,问题在哪里,该怎么写?


private final byte[] lock= new byte[0];

public void run() {
....
synchronized (lock) {
IniFileProcessor pro = new IniFileProcessor(path);
String currStation = "station" + getI().toString();
String currStat = "";
if (success.equals("1")) {
pro.updatePropettyValue(currStation, "stat", "0", null);
pro.updatePropettyValue(currStation, "mail", "0", null);
} else {
if (pro.getPropertyValue(currStation, "stat") != null) {
currStat = pro.getPropertyValue(currStation, "stat");
}
currStat=Integer.toString(Integer.parseInt(currStat)+1);
pro.updatePropettyValue(currStation, "stat", currStat, null);
}
pro.saveFile();
}

....
...全文
221 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wula0010 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wct1988 的回复:]
private final byte[] lock= new byte[0];
改为
private static final byte[] lock= new byte[0];
试试
[/Quote]

这个正确,忘记结贴了,.......
tinyloop 2011-02-03
  • 打赏
  • 举报
回复
学习当中
AskForAnswers 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wzju64676266 的回复:]
private final byte[] lock= new byte[0];

synchronized (lock)


这样写,当你新创建线程的时候,byte也是新分配的,相当于一个新的锁(monitor),变量改成static就行了,也可以用其他办法
[/Quote]

正解。
wzju64676266 2011-01-26
  • 打赏
  • 举报
回复
private final byte[] lock= new byte[0];

synchronized (lock)


这样写,当你新创建线程的时候,byte也是新分配的,相当于一个新的锁(monitor),变量改成static就行了,也可以用其他办法
lk198186 2011-01-26
  • 打赏
  • 举报
回复
加锁的是资源,不是线程本身。
noock 2011-01-25
  • 打赏
  • 举报
回复
IniFileProcessor pro = new IniFileProcessor(path);
这个是局部变量,用的不是一个文件描述符,把它定义为成员变量
private IniFileProcessor pro = new IniFileProcessor(path);

void run( )
{
synchronize(pro){
/// write something here
}
}
zn85600301 2011-01-25
  • 打赏
  • 举报
回复
IniFileProcessor 里面的方法没加上同步锁吧
你不应该锁线程本身吧
qingyuan18 2011-01-25
  • 打赏
  • 举报
回复
你要同步什么?如果是读写文件的同步,你sychronzided加锁的对象应该是pro或者线程的this指针,synchronized (lock) 加一个final变量的锁有什么意义?每个线程都有一个lock的变量,用这个控制不了并发

最简单办法就是直接把你操作文件的代码用sychonrized包起来
Diamond_Ace 2011-01-25
  • 打赏
  • 举报
回复
private final byte[] lock= new byte[0];
改为
private static final byte[] lock= new byte[0];
试试
dracularking 2011-01-25
  • 打赏
  • 举报
回复
操作未同步表现在什么地方
代码运行的上下文环境要再多描述点 同步块什么情况下启动等
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
观望,等待高手

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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