谁来讲讲静态方法的同步问题 本帖最后由 didengxiaren 于 2010-07-23 15:04:15 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static synchronized void m(String threadName){ for(int i=0;i<10;i++){ System.out.println(threadName+":"+i); } }上面这个静态方法的static修饰符是不起作用的,静态方法不存在线程访问冲突,只有静态方法中的公共变量才会有这个问题:函数方法只是一段计算机指令而已,多线程运行的那个静态方法的代码在内存中就一块,只是堆栈和寄存器中的内容(数据)不一样而已。同步需要同步的是全局变量,并非是代码。 synchronized 对静态方法的修饰和对非静态方法的修饰是同样的作用吧。都是用于线程同步。只是静态方法可以通过类名调用,而非静态方法必须构建新对象后再调用。 synchronized修饰静态方法,相当于对方法所在类的class进行同步public static synchronized void m(String threadName){ for(int i=0;i<10;i++){ System.out.println(threadName+":"+i); }}相当于public static void m(String threadName){ synchronized(TestStaticMethod.class){ for(int i=0;i<10;i++){ System.out.println(threadName+":"+i); } }} 任何 Object 都有一个隐含锁,非static方法是属于 对象实例 object的,同步时使用 对象实例 object的隐含锁而static方法属于Class 类对象,static 方法同步是使用的 Class对象的隐含锁。楼上 redduke1202 说的正解 求解!为什么调用update() 不能解决闪烁现象这问题 [javascript求助] event的cancelBubble属性问题 以下语句可以实现类同步吗? 明天去国人通信面试,不知公司如何?考什么东东? 菜鸟问题:java 可不可以有类似资源文件的那种方式,将图片或其他资源做到一个执行文件里 对SQL Server2000比较熟的朋友请进 在JAVA中如何正确显示中文字体? 在线等待:该怎么办? 为什么是0?实在不明! java 怎么实现c语言里的双井号功能,就是连接字符## 请假熬一个问题先 各位大虾帮帮忙 引擎程序!
public static synchronized void m(String threadName){
for(int i=0;i<10;i++){
System.out.println(threadName+":"+i);
}
}
上面这个静态方法的static修饰符是不起作用的,静态方法不存在线程访问冲突,只有静态方法中的公共变量才会有这个问题:
函数方法只是一段计算机指令而已,多线程运行的那个静态方法的代码在内存中就一块,只是堆栈和寄存器中的内容(数据)不一样而已。同步需要同步的是全局变量,并非是代码。
只是静态方法可以通过类名调用,而非静态方法必须构建新对象后再调用。
for(int i=0;i<10;i++){
System.out.println(threadName+":"+i);
}
}
相当于
public static void m(String threadName){
synchronized(TestStaticMethod.class){
for(int i=0;i<10;i++){
System.out.println(threadName+":"+i);
}
}
}