您的位置:首页 > 编程语言 > Java开发

java synchronized同步静态方法和同步非静态方法的区别与举例

2015-03-12 09:12 459 查看
synchronized关键字是java并发编程中为了解决线程对共享资源的竞争造成错误,而提供的解决方案。synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对象变量,你也可以通synchronized来同步类中的静态方法和非静态方法。那么问题来了,同步静态方法与动态方法有什么区别呢?看完下面这个例子或许你就明白了。
public class test2 {

 public static int count = 0;
public static synchronized  void inc() {
count++;
}
public synchronized  void inc2() {
count++;
}



public static void main(String[] args) {

//同时启动1000个线程,去进行i++计算,看看实际结果

for (int i = 0; i < 10000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
test2 t=new test2();
<span style="white-space:pre">	</span>test2.inc();   //同步静态方法
<span style="white-space:pre">			</span>t.inc2();//同步动态方法
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>} 
<span style="white-space:pre">	</span>Thread.sleep(1000);
<span style="white-space:pre">	</span>System.out.println("结果: "+count);
}
}
在上面例子中,分别运行test2.inc()与t.inc2(),发现,当同步静态方法时,结果始终为10000,而当运行同步动态方法时,结果则可能不为10000.

究其原因,调用synchronized非static方法加到当前对象上,static方法加到类的Class对象上。由于在Main中的循环每一次动创建一个test2对象,所以运行非静态方法inc2时,加锁的对象只是当前线程中的对象,实际上并没有实现对其它线程中test2对象的限制,因此可能出现多个对象同时写count,而static方法是对class对象加锁,对该对象中的包括static变量的访问都会受到同步的控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐