• 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拥有锁重入的功能。看一个例子:

  • 相关阅读:
    《剑指offer》第三十五题(复杂链表的复制)
    《剑指offer》第三十四题(二叉树中和为某一值的路径)
    分支限界法
    回溯法小实例
    BUFSIZ解析
    ofstream和ifstream详细用法
    回溯法——最大团问题(Maximum Clique Problem, MCP)
    位运算应用之二——大小写转换
    回溯法——n后问题
    回溯法——批处理作业调度
  • 原文地址:https://www.cnblogs.com/tangwangming/p/8820491.html
Copyright © 2020-2023  润新知