Java关键字之synchronized

来源:互联网 发布:jq删除数组中指定元素 编辑:程序博客网 时间:2024/05/17 09:12

      我相信很多初学java的同学第一次见到这个关键字的时候都头痛不已,什么玩意啊?长长的一大串,不像个单词……应该基本不会用到吧(反正我第一次看见的时候就是这样想的)。最近在学习多线程方面的知识,刚好又要学这个关键字,所以在此做个笔记,也方便以后自己查阅。
      当有多个线程同时访问某个对象的实例变量、或者类变量时,就会出现我们经常所说非线程安全。这里的非线程安全并不针对方法的私有变量,因为方法中的私有变量时每个线程都会独有的,并不会发生非安全访问。下面先列出我了解到的synchronized关键字的性质,有缺少的部分欢迎大家指出。

1.访问同步方法:使用synchronized关键字修饰方法时,多个线程同时访问同一实例的该方法会被同步,同一时间只有一个线程能获得当前对象的锁,获得锁之后会进入方法,方法执行完毕自动释放锁。
2.访问其他方法:当我们访问使用synchronized关键字修饰的方法时,可以访问该实例其他未同步的方法,无法访问该实例其他被synchronized修饰的方法。但是可以在synchronized方法中访问其他synchronize的方法,因为它是重入锁。
3.锁的是什么:就我理解的话,synchronized关键字锁的是一个对象,因为多个线程可以获取多个实例的多个锁,每个实例都会产生一个自己的锁。
4.提高效率:当我们使用同步方法时,可能我们只需同步改方法中修改实例变量的部分,这时我们就可以使用同步代码块的方式来提高程序的执行效率。同样,第2条适合同步块之间的访问。
5.互斥&可见:synchronized不仅可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改效果。

      由于几个性质的测试代码较多,贴出来也不方便大家看,所以把代码全都放在github上,这样大家如果想验证相关性质就可以在本地更好的实践了,代码中有详细的注释——synchronized性质验证代码。不足之处欢迎大家指出指正。

0 0
原创粉丝点击