- 实例同步方法
- 静态同步方法
- 实例同步方法块
- 静态同步方法快
- 每一个类都对应一个Class对象,这个Class对象只有一个锁,因此可将该锁视作是类锁。
- 每一个类可以被实例化成无数个对象,而每一个对象只有一个锁。
- 对于多个线程,同时访问一个类的类成员变量,或者访问一个对象的成员变量,就会造成线程安全问题。对于这些共享的数据会造成读取不一致的问题。
共享实例对象
多个线程共享同一个实例对象,那么对于实例对象的实例变量就会造成线程安全的问题。在共享对象的方法中,如果有访问到共享的这些实例变量,则需要通过实例对象唯一的锁来达到互斥。因此有两种方法可以达到目的,1、在调用的实例方法上上锁。2、加入同步块。
synchronized_instance.png- 通过在实例方法上上锁,表明只要拥有当前所在的实例对象的锁,才可以访问该方法。因为锁只有一把,因此保证同一个时刻只有一个线程访问同步的实例方法。
public/private/protected synchronized void methodName(){ //操作 } - 通过同步块达到互斥的目的,多个线程驱动同步快所在的方法执行时,如果同步块是使得某个共享的实例对象的实例成员变量达到互斥,则线程进入同步块必须拥有这个实例对象的锁才行,因此保证同一个时刻只能有一个线程进入该同步块。
synchronized(共享对象){ //操作 }
共享Class对象
synchronized_static.png
- 通过在静态方法上上锁,表明只有当前类对应的Class对象的锁,才可以访问该静态方法。因为一个Class对象只有一把锁,因此可以保证同一个时刻只能有用一个线程进入该静态方法。
public/private/protected synchronized static void methodName(){ //操作 } - 使用同步块。多个线程驱动同步块所在的方法时,如果同步块的目的是为了使得共享的某个类的类变量互斥,则线程进入到同步块必须拥有这个类的锁才行,从而保证同一个时刻只能有同一个线程进入该同步块。
synchronized(共享类.class){ //操作 }
网友评论