1 java锁有类锁(通过类名来访问的static方法),对象锁(针对非static方法),方法锁(针对非static方法)
类锁(示例1):
public class Test{
public static void execute(){
synchronized(TestThread.class){
...;
}
}
}
类锁(示例2):
public class Test{
public synchronized static void execute(){
...;
}
}
对象锁(示例1):
public class Test{
public void execute(){
synchronized(this){//参数为类对象,锁定该对象的其余全部的synchronized控制的方法。
...;
}
}
}
对象锁(示例2):
public class Test{
public synchronized void print(){
....;
}
}
方法锁:
public class Test{
private static final byte[] lock = new byte[0];//虚拟锁
public void print(){
synchronized(lock){//只锁定该虚拟锁控制的方法
...;
}
}
}
synchronized参数为锁钥匙,
参数的不同钥匙的数量也不同
(为(static final的类型)虚拟锁时,钥匙数量只有一把。为类全路径时,钥匙数量只有一把。为类对象时,则钥匙数量会有很多),
钥匙只有一把,则能保证每时每刻只有一个线程能访问synchronized方法。
别人执行时先要得到这把钥匙才行。没有得到钥匙则需要等待。
如果参数为虚拟锁(static final的类型),则保证每时每刻只有一个线程能访问同步方法。
如果参数为类全路径(例如类名.class),则保证每时每刻只有一个线程能访问同步方法。
如果参数为该类对象,则是锁定该对象的,保证该对象的,其余的对象则不受影响能继续访问。
如果synchronized放在非static上面,默认是该对象锁。
如果synchronized放在static上面,则默认是类锁,保证每时每刻只有一个线程能访问同步方法。
类锁(示例1):
public class Test{
public static void execute(){
synchronized(TestThread.class){
...;
}
}
}
类锁(示例2):
public class Test{
public synchronized static void execute(){
...;
}
}
对象锁(示例1):
public class Test{
public void execute(){
synchronized(this){//参数为类对象,锁定该对象的其余全部的synchronized控制的方法。
...;
}
}
}
对象锁(示例2):
public class Test{
public synchronized void print(){
....;
}
}
方法锁:
public class Test{
private static final byte[] lock = new byte[0];//虚拟锁
public void print(){
synchronized(lock){//只锁定该虚拟锁控制的方法
...;
}
}
}
synchronized参数为锁钥匙,
参数的不同钥匙的数量也不同
(为(static final的类型)虚拟锁时,钥匙数量只有一把。为类全路径时,钥匙数量只有一把。为类对象时,则钥匙数量会有很多),
钥匙只有一把,则能保证每时每刻只有一个线程能访问synchronized方法。
别人执行时先要得到这把钥匙才行。没有得到钥匙则需要等待。
如果参数为虚拟锁(static final的类型),则保证每时每刻只有一个线程能访问同步方法。
如果参数为类全路径(例如类名.class),则保证每时每刻只有一个线程能访问同步方法。
如果参数为该类对象,则是锁定该对象的,保证该对象的,其余的对象则不受影响能继续访问。
如果synchronized放在非static上面,默认是该对象锁。
如果synchronized放在static上面,则默认是类锁,保证每时每刻只有一个线程能访问同步方法。