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变量的访问都会受到同步的控制。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。