Java static / non-static synchronized方法同时修改static成员变量,会有问题吗?
Java里static
和non-static
synchronized方法锁住的分别是对象
和类
,因而是可以同时执行的,那么会存在修改问题吗?搜索没有得到比较关联的答案,来这里问问大家:
示例代码如下:
public class Test {
private static int staticVariableOne = 0;
public synchronized void nonStaticFunction() {
// do some works
staticVariableOne++;
// do some works
}
public synchronized static void staticFunction() {
// do some works
staticVariableOne++;
// do some works
}
}
以上,两个线程分别同时调用nonStaticFunction()和staticFunction(),会出现这种情况(导致一次修改丢失)吗:
1. nonStaticFunction 读 staticVariableOne = 0
2. nonStaticFunction 阻塞
3. staticFunction 读 staticVariableOne = 0
4. staticFunction 写 staticVariableOne = 1
5. nonStaticFunction 继续
6. staticFunction 写 staticVariableOne = 1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
参考StackOverflow问题:
http://stackoverflow.com/ques...
但是,还是意犹未尽,还请各位多多指教、探讨!
补充:
运行如下测试程序,最后的结果并不是20000,中间有很多次结果都被覆盖了。
不清楚你的困惑在哪里……
static
和non-static
synchronized方法锁住的分别是对象
和类的实例
,锁的作用对象都不同。你分别通过threadOne
调用add()
方法,threadTwo
调用addStatic()
方法,两个线程同时对一个线程不安全的共享变量进行值的修改,肯定要注意并发问题。要解决你的问题的话,有两个方案:(1)定义一个私有构造函数,禁止类被实例化,让所有的操作都通过
Test.addStatic()
方法去执行;(2)使用线程安全的方式来申明变量
staticVariableOne
。