技术学习笔记
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode

2.1同步

1. 单例模式下并发访问同一个对象的内容

synchnized 同步锁,使得调用方法变成同步访问对象属性

2.多个对象多把锁

方法带有 synchronized 则一个对象带有一把锁,多个对象在 JVM 中是异步的,所以多个对象的多把锁表现为异步的。

3. 脏读

setValue() 时,中途进行 getValue() ,如果 getValue() 没有同步则可能出现脏读。

同步锁作用于对象,非同步方法可以异步调用,同一对象的多个同步方法是同步调用。

public class MyObject {
    private String userName = "A";
    private String password = "AA";
    synchronized public void setValue(String userName, String password){
        this.userName = userName;
        try {
            Thread.sleep(3000);//delay cause the dirtyRead
        }catch (Exception e){

        }
        this.password = password;
    }

    public void getValue(){
        System.out.println(this.userName + "," + this.password);
    }
}

getValue() 加上同步之后不会有脏读

public class MyObject {
    private String userName = "A";
    private String password = "AA";
    synchronized public void setValue(String userName, String password){
        this.userName = userName;
        try {
            Thread.sleep(3000);//delay cause the dirtyRead
        }catch (Exception e){

        }
        this.password = password;
    }
	//Add synchronized
    synchronized public void getValue(){
        System.out.println(this.userName + "," + this.password);
    }
}

4. synchronized 锁的重入

一个线程获得某个对象的锁,对象锁未释放时还想再次获得锁,是可以的。

如果锁不可重入,会造成死锁。

子类可以通过“可重入锁”调用父类的同步方法。

当前线程出现异常时,锁自动释放。

同步不具有继承性。

5. synchronized 的弊端

若 A 线程执行任务花的时间较长,那么 B 线程会等待较长时间。

  • 可以使用同步块的方法来解决,同步块也是锁定对象。

    synchronized(this){
        this.data = data;
    }
    

    只同步共用的部分。

小结

  • 每个对象都具有锁性质。
  • synchronized 默认锁住的是对象
  • synchronized(object) 是使用对象监视器来实现同步,使用的锁是 object 的锁。
  • 锁是一个线程与一个同步监视器(锁对象)之间的关系,对象自己作为锁时『synchronized(this)』,自己线程对锁(自身)的访问也涉及锁。不同线程间不加 synchronized 则认为是异步调用。