日期:2014-05-17  浏览次数:20753 次

调用其它程序时候,IO并发问题。
基本原理是利用

Runtime r = Runtime.getRuntime();
r.exec(cmdStringBuffer.toString());


执行了一个CMD命令对一个文件进行了写入操作。

我这里做得例子是注册用户,然后用apache的htpasswd.exe这个二进制文件(当然可以是您手头的任何可以IO操作文件)写入指定的文件passwd。
现在的问题点在多用户同时注册的时候,我调用外部文件写入passwd就会漏写,我该在哪里synchronized或者锁定住文本进行一点点写入呢?


下面写流程

SSH2架子,啥也没写,直接访问BtnAction(测试中,没注入)


public class BtnAction extends ActionSupport
{

@Override
public String execute() throws Exception
{
PasswdConfIO p = new PasswdConfIOImpl();
for (int i = 1; i <= 10; i++)
{
User user = new User();
user.setUsername("yulei" + i);
user.setPassword("admin");

p.addPasswd(user);

Thread.sleep(3000); //这里是我自己的本方法,休眠3秒,因为这个插入根本用不了3秒钟
}

return SUCCESS;
}

}






实现类

public class PasswdConfIOImpl implements PasswdConfIO
{
@Override
public void addPasswd(User user) throws IOException
{
// 读出来配置文件中的文件路径
Properties pro = new Properties();
pro.loadFromXML(new FileInputStream(Constant.CONFIG_XML_PATH));

StringBuffer cmdStringBuffer = new StringBuffer();
cmdStringBuffer.append(Constant.CMD) // cmd基础命令
.append(pro.getProperty(Constant.HTPASSWD_PATH_NAME)) // htpasswd.exe完整文件路径
.append(Constant.CMD_HTPASSWD_B) // -b 表示增加用户,默认 MD5 加密密码
.append(Constant.PASSWD_PATH) // passwd.conf完整文件路径
.append(Constant.CMD_SPACE).append(user.getUsername()) // 用户名
.append(Constant.CMD_SPACE).append(user.getPassword()); // 密码

Runtime r = Runtime.getRuntime();
r.exec(cmdStringBuffer.toString());
}
}


具体执行命令如下:
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei1 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei2 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei3 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei4 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei5 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei6 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei7 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei8 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei9 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei10 admin

这是等待后按照我自己思路应该的正常执行。



现在问题就在去掉睡眠那句后,连续10条插入肯定会遗漏的。


这里我试过把addPasswd方法给synchronized的,但是没起到效果,我的想法是:只要执行命令时候passwd 是synchronized的,那就实现自己要的同步效果了。但是可惜没起到过结果。

自己思考了下,因为IO操作时htpasswd.exe完成的,所以我的synchronized似乎不对它起效,现在除了等待,希望各位能给我个其它的思路。


这会写过程,我又