synchronized 怎么用?

lilygt 2013-08-30 04:22:14
public class RegManage {

private static byte[] lock = new byte[0]; // 为了锁而设定的内容
public String OnlyCheckQuota() throws Exception {

synchronized (lock) {

cnt=checkQuota();//读取数据库一张表的总数
if(cnt<100){
。。。。。。。。
//给表加一条记录
}


System.out.print("*******" + cnt + "^^^^^^^" + "\n");
//cnt是从数据库里面读取出来的一个总数,正常如果控制住了,总数会一个一个的加上去(1,2,3,4,5),没控制住,就会读出几个一样的总数(1,2,2,4,4,6)。
}
}

}




在线程情况下,没有锁住,为什么,要怎么做呢。
...全文
159 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZZZ5512536 2013-08-31
  • 打赏
  • 举报
回复
RegManage 这个类配置成单例或更改synchronized 内容。
  • 打赏
  • 举报
回复
引用 5 楼 lilygt 的回复:
我是分了三层,ACTION(处理网页传过来的内容)里面的方法调用了RegManage方法,RegManage这个又再调用和数据库相关联的方法。 xxhhbb1538 你说可能是我没锁住的原因,不同线程使用了不同的RegManage 对象,那要解决这个问题要怎么办吗?把RegManage整个锁住?synchronized (RegManage.class) 这样??
这样是可以的,因为RegManage.class只有一个,相当于一个单例模式了
lilygt 2013-08-31
  • 打赏
  • 举报
回复
我是分了三层,ACTION(处理网页传过来的内容)里面的方法调用了RegManage方法,RegManage这个又再调用和数据库相关联的方法。 xxhhbb1538 你说可能是我没锁住的原因,不同线程使用了不同的RegManage 对象,那要解决这个问题要怎么办吗?把RegManage整个锁住?synchronized (RegManage.class) 这样??
无聊找乐 2013-08-30
  • 打赏
  • 举报
回复
synchronized (RegManage.class)
soulx 2013-08-30
  • 打赏
  • 举报
回复
线程调用代码是什么? 这个应该是锁的作用域不对。虽然锁是lock ,但你有好多这样不同的锁,所以锁不住。
  • 打赏
  • 举报
回复
byte[] lock在RegManage 内部,如果你多个线程共享一个RegManage 对象的话是可以锁住的,如果不同线程使用了不同的RegManage 对象,则锁不住的。对单例加锁是一个可行的方式。
itzgs 2013-08-30
  • 打赏
  • 举报
回复
1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象; 3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;

67,513

社区成员

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

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