很多同学在学习synchronized的时候,只知道是加锁,但是synchronized锁的什么?synchronized修饰静态方法和非静态方法有什么区别?
概念:
(1)互斥的基本条件:共用同一把锁
(2)静态方法锁的是所在类的Class对象,而非静态方法锁的是this对象
(3)针对同一个线程,synchronized支持可重入
若synchronized修饰的非静态方法,那么线程在执行到该方法时,会先判断它是否被加锁,如果加了锁,读锁,找到加锁的对象,等待,直到其他线程释放锁,即可获取到锁。
静态同步方法和非静态方法互斥吗?
各玩各的,不是同一把锁,谈不上互斥。
如下例:
package com.example.dome1;
public class test {
//synchronized修饰非静态方法
public synchronized void function() throws InterruptedException {
for (int i = 0; i <3; i++) {
Thread.sleep(1000);
System.out.println("function1 running...");
}
}
//synchronized修饰静态方法
public synchronized static void staticFunction()
throws InterruptedException {
for (int i = 0; i < 3; i++) {
Thread.sleep(1000);
System.out.println("Static function running...");
}
}
public static void main(String[] args) throws InterruptedException {
final test demo = new test();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
staticFunction();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
demo.function();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
t1.start();
}
}
输出结果:t1和t2线程锁的不是同一把锁,所以不会互斥。