package com.neutron.t01;
/**
* 解说内容:synchronized关键字对某个对象进行加锁
*
*/
public class T01 {
private int count = 10;
private Object obj = new Object();
public void m() {
// 任何线程要执行下面的代码,必须先拿到obj这把锁
synchronized (obj) {
count --;
System.out.println(Thread.currentThread().getName() + " count:" + count);
}
}
}
/*
过程解说:
1.Object obj = new Object(),说明在堆内存中new Object()
2.synchronized(obj),说明要执行synchronized中的代码,需要先申请obj这把锁
3.需要注意的是锁指的是堆内存中的对象数据,而不是堆内存的引用obj。在申请锁的时,锁的真正信息实在堆对象中的。
如果锁引用的内容在堆中发生改变,那么锁的内容同时发生改变。
4.当a线程执行到synchronized时去申请obj这把锁,如果没有其他线程执行,那么a线程拿到obj这把锁,当线程执行到代码块中任一一行,
比如count--时,b线程执行到synchronized时去申请obj这把锁,但此时a线程已经在执行同步代码块,且将这段代码锁定,
那么b线程只能等待a线程执行完这块代码块,等待a线程释放obj这把锁,然后b线程获取obj这把锁,锁定这段代码,然后执行同步代码块内容。
5.只要有线程拿到这把所,其他线程就拿不到这把锁,因此称这把锁为互斥锁。
*/