image.png
什么是同步,就是让Object 象同一时间只能被一个 Thread 读写。
如何实现呢?
就是给每个 Object 里面加一把锁,哪个 Thread 在使用这个 Object 就把这个对象上的锁给谁,直到这个 Thread 执行完对这个 Object 的操作,把 Object 上的锁还给这个 Object ,然后下一个 Thread 才能对这个 Object 进行操作
synchronized 干的事就是这样,管理对象上锁,只给一个线程对象,保证同一时刻只有一个线程能操作这个对象。
Synchronized,它就是一个:非公平,悲观,独享,互斥,可重入锁。
优化以后,是基于JVM内部实现,可以根据竞争激烈程度,从偏向锁-->轻量级锁-->重量级锁升级。
synchronized 本身是一个关键字,用来修饰普通方法,静态方法和代码块。
修饰代码块 synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁。
public int synMethod( int a1) {
synchronized(a1) {
//一次只能有一个线程进入
}
}
修饰方法 放在范围操作符(public等)之后,返回类型声明(void等)之前.
这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.
public synchronized void synMethod() {}
修饰对象 synchronized后面括号里是一对象,此时,线程获得的是对象锁.
synchronized(ArrayWithLockOrder.class) { }