博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java Synchronized 学习
阅读量:4577 次
发布时间:2019-06-08

本文共 1603 字,大约阅读时间需要 5 分钟。

前言

顾名思义,同步的意思。当两个线程对一个对象实例进行读写操作的时候,很容易引起读写脏数据、不可重复读、丢失更新的问题。

当代码块被声明了一个Synchronized的时候,就意味着该代码块只能有一个线程能读,其他线程只有等待的状态,等待其他线程读完

才能获得该代码块的执行权,本文以理论理解为主,快速回忆;

 

正文

 

第一种方式:同步类中的方法,静态方法和非静态方法。

public synchronized void method()  {      }

同理,对于静态方法来说,只要加上了synchronized关键字,这个方法就是同步的,

class Test   {          public static synchronized void method() {                              }  }

第一种方式的特点:

1. synchronized关键字不能继承。

虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。

如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,

而必须显式地在子类的这个方法中加上synchronized关键字才可以。

2,在定义接口方法时不能使用synchronized关键字。

3. 构造方法不能使用synchronized关键字

4,但大量使用synchronized关键字会造成不必要的资源消耗以及性能损失。

虽然从表面上看synchronized锁定的是一个方法:但实际上synchronized锁定的是一个类。也就是说,如果在非静态方法method1和method2定义时

都使用了synchronized,在method1未执行完之前,method2是不能执行的。静态方法和非静态方法的情况类似。但静态method1和非静态方法method2,

这样就不会互相影响。

如果在类中使用synchronized关键字来定义非静态方法,那将影响这个中的所有使用synchronized关键字定义的非静态方法。如果定义的是静态方法,那么将影响类中所有使用synchronized关键字定义的静态方法。这有点象数据表中的表锁,当修改一条记录时,系统就将整个表都锁住了,因此,大量使用这种同步方式会使程序的性能大幅度下降。

 

第一种方式:代码块同步:

同步非静态代码块:需要synchronized(this)

public void method()  {          … …          synchronized(this){                                … …      } }

同步静态代码块:

public class StaticSyncBlock {            public static void method1() {         synchronized(StaticSyncBlock.class){                … …                     }            }        }

特点:在使用synchronized块同步类方法时,非静态方法可以使用this来同步,而静态方法必须使用Class对象来同步。它们互不影响。

当然,也可以在非静态方法中使用Class对象来同步静态方法。但在静态方法中不能使用this来同步非静态方法。

这一点在使用synchronized块同步类方法时应注意。

 

 

 

转载于:https://www.cnblogs.com/diason/archive/2013/01/30/2882965.html

你可能感兴趣的文章
一篇学术论 文投稿的所有流程是怎样的?
查看>>
Ionic的项目结构(angluar js)
查看>>
mysql的基本操作
查看>>
2019.07.21软件更新公告
查看>>
FFT模板
查看>>
Android热修复AndFix
查看>>
软件工程(C编码实践)学习总结及心得
查看>>
lnmp-zabbix
查看>>
ruby on rails网站快速上手之环境搭建
查看>>
时间进度表
查看>>
[codevs1746][NOI2002]贪吃的九头龙
查看>>
[在职软件工程]面向对象的分析与设计
查看>>
sweetalert弹层框架
查看>>
Python从菜鸟到高手(1):数字的奥秘
查看>>
MVC几种传值方式
查看>>
hdu2098的总结
查看>>
一个项目质量的连锁反应链
查看>>
B1821 [JSOI2010]Group 部落划分 Group 二分答案&&并查集
查看>>
eclipse 查看原始类出现The jar file rt.jar has no source attachment解决方法
查看>>
数组实现UITabview的cell设置
查看>>