zoukankan      html  css  js  c++  java
  • static synchronized与synchronized

    区别

    synchronized关键字
    synchronized作用是对类的当前实例(对象)加锁。可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁(Java 并发编程)。

    synchronized代码块【synchronized(synObject)】使用起来比synchronized方法要灵活得多。因为也许一个方法中只有一部分代码只需要同步,如果此时对整个方法用synchronized进行同步,会影响程序执行效率。而使用synchronized代码块就可以避免这个问题(同步对象或类属性),synchronized代码块可以实现只对需要同步的地方进行同步。

    与Lock的区别:

    1. synchronized是Java语言的关键字,因此是内置特性,Lock是一个类(java.util.concurrent.locks包),通过这个类可以实现同步访问;
    2. synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用。Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。

    static synchronized:
    每个类有一个锁,它可以用来控制对static数据成员的并发访问。访问static synchronized方法占用的是类锁,而访问非static synchronized方法占用的是对象锁。

    static synchronized控制类的所有实例(对象)的访问(相应代码块)。synchronized相当于 this.synchronized,static synchronized相当于Something.synchronized

    代码解析:

    package com.xianggen.concurrent;
    /**

    • static synchronized 和synchronized的区别!

    • 关键是区别第四种情况!

    • */

    • public class StaticSynchronized {

      /**

      • synchronized方法
        */
        public synchronized void isSynA(){
        System.out.println(“isSynA”);
        }
        public synchronized void isSynB(){
        System.out.println(“isSynB”);
        }

      /**

      • static synchronized方法
        */
        public static synchronized void cSynA(){
        System.out.println(“cSynA”);
        }
        public static synchronized void cSynB(){
        System.out.println(“cSynB”);
        }

      public static void main(String[] args) {
      StaticSynchronized x=new StaticSynchronized();
      StaticSynchronized y=new StaticSynchronized();
      /**
      * x.isSynA()与x.isSynB() :不能同时访问(同一个对象访问synchronized方法)
      * x.isSynA()与y.isSynB() :能同时访问(不同对象访问synchronized方法)
      * x.cSynA()与y.cSynB() :不能同时访问(不同对象也不能访问static synchronized方法)
      * x.isSynA()与y.cSynA() :能同时访问(static synchronized方法占用的是类锁,而访问
      * synchronized方法占用的是对象锁,不存在互斥现象)
      */
      }

  • 相关阅读:
    NLP 中的embedding layer
    Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)
    我对REST的理解
    QML 与 C++ 交互之工厂方法
    Hive分析窗体函数之LAG,LEAD,FIRST_VALUE和LAST_VALUE
    【C/C++】:用C实现输出日期的阴历日子
    Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
    统计报表
    2015 HDU 多校联赛 5363 Key Set
    查看sedna创建的数据库和集合,文档之类
  • 原文地址:https://www.cnblogs.com/cyy489/p/13286068.html
Copyright © 2011-2022 走看看