关于java线程同步

   很久没写博文了,忙碌了一年多,在技术上走了好多弯路,还好因为本身坚持不懈的努力终于从弯路中摆脱出来了,最近想回顾下关于java线程同步的知识,在这里抛砖引玉,但愿热爱技术的程序猿们能一块儿进步。java

   说到java线程同步确定离不开synchronized,而关于synchronized这个关键字的细节,热爱技术的朋友们是否真正掌握了呢?多线程

   你们都知道,每一个java类都有一个继承来自Object的对象锁,也就是说new一个实例的同时虚拟机就赋予了这个实例的一个对象锁,而且这个锁是惟一的,那么这个跟synchronized这个有什么关系呢?关系大着呢,看如下代码:测试

class Demo1 {
   int index = 0;
   public synchronized void getI() {
       index=index+1;
   }
   public synchronized void setI() {
       index=index-1;
   }

}线程

class Demo2 {
   int index = 0;
   public synchronized void getI() {
       index=index+1;
   }
   public void setI() {
       index=index-1;
   }

}对象

Demo1类里面有两个声明了synchronized这个关键字的方法,Demo2里面只有一个方法加了声明,这二者的区别是什么呢?(这里有兴趣的朋友能够本身写测试用例去观察一下index变量的区别,这里只把结论说出来)。若是你真正测试了,你就会发现Demo1的某个实例中在多线程环境下的某个时刻只能执行一个方法,而Demo2能够同时执行,为何呢?这里面就有上面说到的对象锁的概念了,一个synchronized关键字代表该对象锁正在被占用,一个声明了synchronized关键字的方法只有拿到当前对象的对象锁才能执行该方法。blog

   以上只是单纯的谈了同步方法没有谈同步代码块,其实二者的区别主要就是做用域大小的关系,在这里就很少坐解释了。继承

   你们必定还想知道synchronized static与synchronized二者的区别吧,你们可能都知道static是类级别的关键字,已经超越了对象的概念了,那么简单点你们能够理解为类锁,没错JDK有对象锁的概念也有类锁的概念呢。作用域

class Demo {
   int index = 0;

   public synchronized static void getI(Demo demo) {
       demo.index=demo.index+1;
   }

   public synchronized void getI() {
       index=index+1;
   }

   public synchronized  void setI() {
       index=index-1;
   }
   public synchronized static void setI(Demo demo) {
       demo.index=demo.index-1;
   }
}get

你们仔细看一下Demo类的四个方法两个类方法,两个对象方法,这个类主要想象你们说明什么问题呢?其实很简单就是想告诉你们类方法的同步方法与对象方法的同步方法占用的不是同一个锁,一个是类锁,一个是对象锁,所以他们不会出现互相抢占锁的状况。
同步

本文出自 “陈砚羲” 博客,转载请与做者联系!

相关文章
相关标签/搜索