前言
直接说结论:
1.Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。
2.Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。
3.对于类锁synchronized static,是通过该类直接调用加类锁的方法,而对象锁是创建对象调用加对象锁的方法,两者访问是不冲突的,对于同一类型锁锁住的方法,同一对象是无法同时访问的.
一、Synchronized修饰非静态方法
Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。
如果采用形象的比喻就是,对于这个对象可能有很多方法(房间),有一些加了锁(锁门的房间),而这些房间共用一把钥匙,导致当一个被锁方法被访问时,无法访问其他带锁的方法。
但是需要注意:一个对象可以拿一把钥匙,多个对象可以插队执行。
考虑下图代码,想一下会输出什么。
public class TestSyn {
public static void main(String[] args) {
Number number = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number.getTwo();
}
}).start();
}
}
class Number{
public synchronized void getOne(){
try {
Thread.sleep(2000);
System.out.println("one");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void getTwo(){
System.out.println("two");