synchronized this object Class的区别
首先放上结论:
1.this:相当于只有一把钥匙的多把锁,他可以锁住多个代码块,但是每次开锁只能一个,如果钥匙在其他代码块手上,那么新来的被锁的多个代码块就拿不到钥匙,进不了方自己的代码块
2.object:每一个object相当于一把锁,那么不同的锁会有不同的钥匙,这样如果自己的锁不同,一样的锁没有被其他人占据,自己开始能进入代码块
3.类.clss:这是静态的锁,应为静态就带有this的含义,所以不能用this,而用类.class
下面是代码
Main方法–其中线程使用lambda表达式
public class Mian {
public static void main(String[] args) {
Material m = new Material();
new Thread(()->{
m.doSome();
}){
}.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
m.deOther();
}
});
t2.start();
}
}
object
class Material{
private int data1=1;
private int data2=2;
private Object lock1 =new Object();
private Object lock2 =new Object();
public void doSome() {
synchronized (lock1) {
try {
System.out.println(++data1);
Thread.sleep(2000);
}catch(Exception e) {
e.printStackTrace();
}
}
}
public void deOther() {
synchronized (lock2) {
System.out.println(data1);
}
}
}
/*-----------------
结果:
1
2//中间没有时间间隔
------------------*/
this
class Material{
private int data1=1;
private int data2=2;
private Object lock1 =new Object();
private Object lock2 =new Object();
public void doSome() {
synchronized (this) {
try {
System.out.println(++data1);
Thread.sleep(2000);
}catch(Exception e) {
e.printStackTrace();
}
}
}
public void deOther() {
synchronized (this) {
System.out.println(data1);
}
}
}
/*-----------------
结果:
1
2//中间时间间隔2秒
------------------*/
class
class Material{
private static int data1=1;
private int data2=2;
private Object lock1 =new Object();
private Object lock2 =new Object();
public static void doSome() {
synchronized (Material.class) {
try {
System.out.println(data1);
Thread.sleep(2000);
}catch(Exception e) {
e.printStackTrace();
}
}
}
public void deOther() {
synchronized (this) {
System.out.println(data1);
}
}
}
/*---------------
输出;
1
2//中间没有时间间隔
---------------*/