java日志类多线程同步问题!

luoyahu 2008-07-16 09:08:03
如题:现在要做一个日志工具类.主要是保存系统生成的日志.
现在遇到多线程访问时不同步的问题.

KLinkLog.initKingLog("c://kinghi1.log", KLinkLog2.DEBUG, "c://log", 100);
KLinkLog.writeLog(KLinkLog2.NORMAL, "kinghi-test1-"+this.hashCode());
initKingLog和writeLog都是synchronized的.

假如出现当一个线程写C://kinghi1.log.而另一个线程写C://kinghi2.log时.
出现的线程又写到了kinghi1.log.也写到了kinghi2.log

代码如下:

public class KLinkLog {
public final static int DEBUG = 3;
//日志名
private static String logName = "./Kinghi.log";
//日志级别
private static int level = 2;
//备份路径
private static String bakPath = null;
//日志文件最大大小
private static int maxSize = 100;
//日期格式化
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.SSS");

private KLinkLog() {

}

public static synchronized void initKingLog(String logName,int level,String bakPath,int maxSize)
{
//参数检测
if(level == KLinkLog.NONE || level < KLinkLog.NONE || level > KLinkLog.DEBUG
|| logName == null ||logName.equals("")
|| maxSize <=0)
{
return;
}
else
{
KLinkLog.logName = logName;
KLinkLog.level = level;
KLinkLog.bakPath = bakPath;
KLinkLog.maxSize = maxSize;

}

}
/**
* 向日志中写日志
* @param level 日志级别
* @param message //写入消息
* @return 返回1为没有写入.返回0为写入成功
*/
public static int writeLog(int level, String message)
{
//.............I/O操作
}
}

解决100分送上.
...全文
323 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
laxila 2008-09-30
  • 打赏
  • 举报
回复
最近正在研习中!!!
laxila 2008-09-30
  • 打赏
  • 举报
回复
楼主辛苦了
majiajun_no_13 2008-09-28
  • 打赏
  • 举报
回复
看贴是学习,顶贴是义务。呵呵
luoyahu 2008-07-16
  • 打赏
  • 举报
回复
谢谢啊.以结账
  • 打赏
  • 举报
回复
帮你顶
xunyiren 2008-07-16
  • 打赏
  • 举报
回复
//日志名
private static String logName = "./Kinghi.log ";

类变量logName在writeLog方法第二次执行时已经被改为C://kinghi2.log,所以会发生这种情况(其它类变量也要注意,如果不变的话最好做成类常量)

解决的办法:1.使用方法内的局部变量 2.把类变量包装在ThreadLocal内,这样不同的线程拥有不同的变量拷贝,互不干扰
捏造的信仰 2008-07-16
  • 打赏
  • 举报
回复
用 ThreadLocal 可以避免不同线程中的 static 成员冲突的问题。
luoyahu 2008-07-16
  • 打赏
  • 举报
回复
自己顶..

62,614

社区成员

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

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