java 多线程中synchronized 机制
1.为什么要用synchronized,因为在多线程的情况下,会读取脏数据。
为什么会有读脏数据呢,他的定义是:在多线程的情况下,对同一个对象的实例进行并发的访问,如果不做同步处理的话,那就有可能读取脏数据。
比如下图中,启动了2个线程都对MyThreadTest t 这个对象去访问。因为要在线程里面用到我这个对象,所以线程类里面用构造方法来传递参数。
最后的打印出来i 都是200,这样就是有问题的,我们如何避免这样结果呢,在test方法上面加上synchronized 这个关键字。
synchronized的概念:关键字synchronize 取得锁是对象锁,而不是对这个方法的锁。那个线程先执行,就会获取持有该方法所属的对象锁,哪个线程就持有该方法所属对象的锁,
其他线程都只能呈等待状态。但是这有个前提:既然锁叫做对象锁,那么势必和对象相关,所以多个线程访问的必须是同一个对象。
下图2个方法里面加了synchronized关键字,所以访问的时候都是同步的,没有任何问题,如果把1个改成普通的方法。就有可能有问题。
1如果A线程持有对象的锁的话,线程B可以直接调用没有用synchronized修饰过的方法,无线等待
2如果A线程持有对象的锁的话,线程B也调用同步的方法的时候,那么需要A释放锁之后,B才能进入、
锁重入:当一个线程得到一个对象锁后,再次请求此对象锁时时可以再次得到该对象的锁的
关键字synchronized拥有锁重入的功能。看一个例子: