Java中线程同步的两种方式

By | 2017年2月24日

Java中线程同步的两种方式

在多线程中,需要控制线程的访问次数,频率和优先级。比如在取钱时如果多个线程同时修改了账户余额,就会出现同步错误,所以Java中提供了线程同步的概念以保证某个资源在某一时刻只能由一个线程访问,保证共享数据的一致性。

下面是一个模拟多线程存取钱时的操作。

BankAccount.java

NoSynBank.java

通过运行结果可以看出,余额发生错误,有时运行也可能没有问题,但没出现问题不等于没有问题,只要出现一个错误,那就是编程问题。

线程同步通常采用以下三种方式:同步代码块,同步方法,同步锁。

同步代码块:

  • synchronized是同步关键字

  • object是同步监视器,线程开始执行同步代码之前,必须先获得对同步监视器的锁定,

注意:任何时候都只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完后,该线程会释放对同步监视器的锁定。

SynBlockBank.java

运行结果:

同步方法

[访问修饰符] synchronized 返回类型 方法名([参数列表]){
//方法体
}
* synchronized关键字修饰的实例方法无须显示的指定同步监视器,同步方法的同步监视器是this,即该方法所属的对象
* 一旦一个线程进入一个实例的任何同步方法,其他线程将不能进入该实例的所有同步方法,但该实例的非同步方法仍然能够被调用
* 使用同步方法可以非常方便的实现线程安全,一个具有同步方法的类也被称为“线程安全的类”,该类的对象可以被多个线程安全的访问,其每个线程调用该对象的方法后都将得到正确的结果

代码:

BankAccount.java

NosynBank.java

运行结果:

  • 注意:synchronized锁定的是对象,而不是方法或代码块,synchronized也可以修饰类,当用synchronized修饰类时,表示这个类的所有方法都是synchronized的

发表评论

电子邮件地址不会被公开。 必填项已用*标注