zoukankan      html  css  js  c++  java
  • [Java并发编程之美]第2章 synchroized关键字

    synchronized关键字

    • synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用。线程在进入synchronized块钱会自动获取内部锁,这时候其他线程访问同步代码块时会被阻塞挂起。
    • synchronized会造成很大的系统开销,尽量避免不必要的使用。
    • 每种设置的锁对于一个对象(/锁加载静态方法和类上时是对于一个类的所有对象)锁只有一把。

    synchronized关键字可以修饰以下这些

    1 synchronized修饰一个方法

    public class SingletonPattern {
    	public synchronized void method() {
    		//todo
    	}
    }
    
    • 若子类中覆盖了父类中synchronized修饰的方法,则默认是不继承synchronized,需要的话要显示的加synchronized。

    2.1 synchronized修饰一个代码块

    	public void method() {
            //other part
            int num1;
            int num2;
    		synchronized(this) {
    			//todo
    		}
    	}
    
    • 当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步的代码块。

    2.2 synchronized修饰一个指定对象

    public class SingletonPattern {
    	public void method(SomeObject obj) {
    		synchronized(obj) {
    			//todo
    		}
    	}
    }
    

    2.3 synchronized修饰一个特殊对象。只想同步代码块,没有明确要锁定的对象时,可以锁定一个特殊的对象

    public class SingletonPattern {
    	private byte[] lock = new byte[0];  // 特殊的instance变量
    	   public void method()
    	   {
    	      synchronized(lock) {
    	         // todo 同步代码块
    	      }
    	   }
    }
    

    3 synchronized修饰静态方法

    • 锁的是类,即类的所有对象共用一把锁。

    4 synchronized修饰类

    class ClassName {
       public void method() {
          synchronized(ClassName.class) {
             // todo
          }
       }
    }
    
    • 同样,所有的类共用一把锁。

    参考链接

    https://blog.csdn.net/sinat_32588261/article/details/72880159

  • 相关阅读:
    JDK8的JVM内存模型小结
    揭开Service Mesh的神秘面纱
    通过Shell脚本读取properties文件中的参数时遇到 换行符的问题
    NodeJs+Express实现简单的Web增删改查
    SpringBoot之Thymeleaf模板引擎
    面向对象(下)
    内部类
    线程学习oneday
    Python-使用tkinter实现的Django服务进程管理工具
    Python-使用百度文字识别API实现的文字识别工具
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11266906.html
Copyright © 2011-2022 走看看