zoukankan      html  css  js  c++  java
  • Synchronized的使用和注意事项

    synchronized:

    1、取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁;

    2、多个线程访问的必须是同一个对象。

    3、当一个线程执行的代码出现异常时,其所持有的锁会自动释放

    4、A线程持有Object对象的Lock锁,B线程可以以异步方式调用Object对象中的非synchronized类型的方法

    5、A线程持有Object对象的Lock锁,B线程如果在这时调用Object对象中的synchronized类型的方法则需要等待,也就是同步

    6、当一个线程得到一个对象锁后,再次请求此对象锁时时可以再次得到该对象的锁的;

    代码块:

    1、A线程访问对象的synchronize代码块时,B线程依然可以访问对象的非synchronize代码块;

    2、A线程访问对象的synchronize代码块时,B线程依然可以访问对象的synchronize代码块将会被阻塞;

    3、线程A访问对象调用synchronize代码块时,线程B访问对象的synchronize方法时,将获取线程A的对象锁;

    4、"任意对象"作为对象监视器来实现同步的功能。这个"任意对象"大多数是实例变量及方法的参数,全局实例变量,synchronized(非this),

            不用阻塞每一个代码块,有效提高效率。

    静态同步方法是类锁,非静态同步方法时对象锁,独立执行。

    1、局部变量每调用一次方法其值都在当前线程的当前栈中临时分配;

    2、也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了;

    3、所以多线程并发访问一个只用到局部变量的方法是不用考虑并发安全性的。

     

    • synchronized (object)与synchronized (this)一样,获取实例对象的锁.
    • 因为synchronized (this)只能获取当前实例锁,那么synchronized (object)就是可以获取其他实例锁的意思
    • 对于synchronized 最简单粗暴的理解就是,你要哪些线程方法同步,就跟他们获取一样的锁好了,A.class,就获取A.class, 
    •  objectA 就获取 objectA(我说的不是对象名相同,而是真真切切在java堆中的同一个对象),



    synchronized与static synchronized 的区别

    synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类该实例的所有synchronized块

    static synchronized恰好就是要控制类的所有实例的并发访问

     
  • 相关阅读:
    Consul 原理
    google ads api —— budget
    rabbitmq 启动报错 Kernel pid terminated
    maven 打依赖包命令
    【原创】Linux基础之supervisor
    Git 常用命令
    Thinkpad T14 AMD版无线网卡不可用
    在Windows10中安装解压版MySQL 8.X
    Git 分支管理参考模型
    Feign入门介绍
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9219807.html
Copyright © 2011-2022 走看看