java synchronized同步静态方法和同步非静态方法的区别与举例
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变量的访问都会受到同步的控制。
文章来自:http://blog.csdn.net/yunfuyiren/article/details/44216877