java 多线程中synchronized 机制

Posted tangw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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拥有锁重入的功能。看一个例子:

 

以上是关于java 多线程中synchronized 机制的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程4:synchronized锁机制

java多线程——锁机制synchronized(同步方法)

java 多线程8 : synchronized锁机制 之 方法锁

java多线程并发系列之 (synchronized)同步与加锁机制

java——同步机制(synchronized, volatile)

java 多线程9 : synchronized锁机制 之 代码块锁