求教!关于 多线程 如何锁定静态变量

a942980741 2012-05-11 11:02:24
class A{
public static int a = 1;
public sychronzied haha(){
a = 2
}
如上面这个程序,synchronized能阻止一个线程用该类一个对象的haha()方法改变a的值吗?
如果可以改变a的值的话,有什么方法可以把a 的值锁住,让其他线程无法更改a
...全文
298 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
beiouwolf 2012-05-15
  • 打赏
  • 举报
回复
习惯上来说,建立一个单独的锁对象,代码阅读也比较清晰
也不容易和其他对象冲突,也不用担心null之类的错误
a942980741 2012-05-14
  • 打赏
  • 举报
回复
回6楼,请问锁住locker对象有什么用处吗
sffx123 2012-05-11
  • 打赏
  • 举报
回复

public static synchronized haha(){
a = 2
}
用类自己来当锁,如果不能改变方法成静态的可以用一个唯一的对象当锁

class A{
public static int a = 1;
private static Integer i = 0;
public haha(){
synchronized(i){
a = 2
}
}


楼主synchronized打错了。
wugui414 2012-05-11
  • 打赏
  • 举报
回复
声明为private,如果不想改变值干脆final
private final static int a = 1;
古布 2012-05-11
  • 打赏
  • 举报
回复
synchronized就保证了,当多个线程同时访问一个方法时,synchronized保证每次只有一个线程访问。
lliiqiang 2012-05-11
  • 打赏
  • 举报
回复
设置一个new Object()就可以了
龙四 2012-05-11
  • 打赏
  • 举报
回复
每个 获取 和 修改 a变量的地方使用同一个锁才可以
-迷糊- 2012-05-11
  • 打赏
  • 举报
回复
直接锁定类即可

synchronized(A.class) {}
beiouwolf 2012-05-11
  • 打赏
  • 举报
回复
在方法上的synchronized和synchronized(this)等价
在static方法上的synchronized和synchronized(本身.class)等价

一般比较建议建一个空对象来专门用作锁
静态对象为锁的话,那此类所有实例都共享这个锁

public class MyClass{
private static final Object locker = new Object();

public void haha() {
synchronized(locker) {
// TODO
}
}
}

62,614

社区成员

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

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