这里大部分的解释都在代码中。
demo1
package synchornizeds;
public class Demo1 {
private int count;
private Object o = new Object();
public void m() {
synchronized (o) { //任何线程执行一下代码都要申请o对应的锁。此处的o是堆内存中new出来的对象,而不是声明的对象引用
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
}
public static void main(String[] args) {
}
}
demo2:
package synchornizeds;
public class Demo2 {
private int count;
public void m() {
synchronized (this) { //任何线程执行一下代码都要申请this对应的锁。
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
/*
* synchronized 关键字锁定的是一个对象 而不是一个代码块
*
*
* 打一个比方: 多个人去上厕所,只有一个马桶 ,不可能所有的人同时上吧,只能是一个一个的,当第一个人进厕所之后,它用锁将门锁住,
* 不让外面的人进来 ,等他结束之后,第二个人进来,继续锁上厕所的门。 这把锁就相当于this
* 也就是说当前对象调用自身类中的方法,需要加锁。this就是指的是当前对象。synchronized锁住的是对象,而不是执行的代码块,
* 就想上面的,锁,锁住的是厕所的门 而不是马桶。。。。。
* */
}
}
demo3:
package synchornizeds;
public class Demo3 {
private int count = 1