synchronized 讲解
- 同步方法的语法格式 :
[修饰符] synchronized 返回值类型 方法名 ([形参列表],......) throws 异常列表{ } synchronized 【修饰符】 返回值类型 方法名(【形参列表】)hrows 异常列表{ }
- 同步代码块的语法格式:
synchronized (obj) { //同步代码块 } }
-
同步代码块
1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块,其语法如下:
synchronized(obj){
//同步代码块
}
其中obj就是同步监视器,它的含义是:线程开始执行同步代码块之前,必须先获得对同步代码块的锁定。任何时刻只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放对该同步监视器的锁定。虽然java程序允许使用任何对象作为同步监视器,但是同步监视器的目的就是为了阻止两个线程对同一个共享资源进行并发访问,因此通常推荐使用可能被并发访问的共享资源充当同步监视器。
-
同步方法
1.同步方法就是使用synchronized关键字修饰某个方法,这个方法就是同步方法,这个同步方法(非static方法)无须显示指定同步监视器,同步方法的同步监视器就是this,也就是调用该方法的对象。通过同步方法可以非常方便的实现线程安全的类,线程安全的类有如下特征:该类的对象可以方便被多个线程安全的访问;
每个线程调用该对象的任意方法之后都得到正确的结果;
每个线程调用该对象的任意方法之后;该对象状态依然能保持合理状态。
法之后都得到正确的结果;
每个线程调用该对象的任意方法之后;该对象状态依然能保持合理状态。
2.不可变类总是线程安全的,因为它的对象状态不可改变可变类需要额外的方法来保证其线程安全,在Account类中我们只需要balance的方法变成同步方法即可。