• synchronized 使用总结


    基于SF现场反馈关于阻塞问题总结

    包含大数据量的 数据集or任务or项目在做审批同意操作时耗时比较长影响其他用户的操作(数据提交,数据审核,任务启动,重启。。。。。)

    经跟进原因是因为执行审批流程推进时有用到synchronized修饰的方法并在方法内循环操作数据 对锁的占用时间较长 导致其他操作时线程无法进入该方法形成线程阻塞!

    解决方案

    将加synchronized修饰方法里的for循环摘出减少同步逻辑处理缩短线程对锁的占用时间

    synchronized的实现原理

      所有对象都自动含有单一的锁(监视器),当在对象上调用其任意synchronized 方法的时候,此对象都被加锁。对于某个特定对象来说,其所有synchronized方法共享同一个锁,这可以被用来防止多个任务同时访问被编码为对象内存。

    当一个线程访问类的一个synchronized 修饰的同步方法时,它就获得了这个当前类的对象锁。这时其它线程对该类的所有同步方法的访问都会形成阻塞,它有两种用法:synchronized 方法和 synchronized 块。

    synchronized 方法:

    public synchronized void startActivity (int n){

    };

    特定对象所有synchronized方法共享同一个锁,这种机制确保了同一时刻对于每一个类实例,

    其所有声明为 synchronized 的成员函数中最多只有一个处于可执行状态(因为最多只有一个能够获得该类实例对应的锁)。

    synchronized 块是可以将同步代码放到代码块中当前线程执行完代码块时锁就被释放了对锁的获取/释放相对灵活:

    synchronized(SyncObject.Class) {

        //允许访问控制的代码

    }

    亦可写成如下格式,this,指的就是当前这个类也可以写成其他类或实例

    synchronized(this) {

        //允许访问控制的代码

    }

  • 相关阅读:
    ::selection
    为什么要web语义化
    label的for属性与inputde的id元素绑定
    a 标签
    IE6 双倍距BUG
    css样式书写顺序
    清除浮动 .clearfix
    Unity利用AnimationCurve做物体的各种运动
    Error: unknown argument: '-websockets'
    关闭VAX的拼写检查_解决中文红色警告问题
  • 原文地址:https://www.cnblogs.com/wangfl/p/10265466.html
Copyright © 2020-2023  润新知