同步实例方法
修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
方法上添加synchronized就叫做同步方法,例如public synchronized void draw(double amount){}
注意:在一个类对象中所有的同步方法是互斥的
- 只要有一个线程进行了当前类对象(只能一个对象)的同步方法,则不允许其它线程在进入当前这个对象的任何同步方法,但是允许进入非同步方法
- 同样当前线程则可以进入当前类对象的其它同步方法,也允许进入非同步方法,当线程进入同步方法,则获取同步锁,离开同步方法则释放同步锁
- 这个锁就是当前类对象
这种方法不是最佳选择,因为这里的同步处理颗粒度太大了(所有当前对象中的同步处理方法都是互斥的),会影响并发性
线程安全的类:是通过使用同步方法的类,同步监视器是this
- 该类的对象可以被多个线程安全地访问
- 每个线程调用该对象的任意方法之后都将得到正确结果
- 每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态
StringBuilder和StringBuffer
- StringBuilder是线程不安全的类,数据不安全,但是并发执行效率高,一般用于定义临时变量
- StringBuffer是线程安全的类,数据安全,但是并发执行效率差,一般用于定义属性