• java 多线程之:synchronized


    1. synchronized原理
      在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。
      当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。
      不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。

    2. synchronized基本规则
      我们将synchronized的基本规则总结为下面3条,并通过实例对它们进行说明。
      第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。
      第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。
      第三条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

    3. synchronized方法 和 synchronized代码块
      “synchronized方法”是用synchronized修饰方法,而 “synchronized代码块”则是用synchronized修饰代码块。
      synchronized方法示例

    public synchronized void foo1() {
        System.out.println("synchronized methoed");
    }
    

    synchronized代码块

    public void foo2() {
        synchronized (this) {
            System.out.println("synchronized methoed");
        }
    }
    

    synchronized代码块中的this是指当前对象。也可以将this替换成其他对象,例如将this替换成obj,则foo2()在执行synchronized(obj)时就获取的是obj的同步锁。
    synchronized代码块可以更精确的控制冲突限制访问区域,有时候表现更高效率。

    1. 实例锁 和 全局锁
      实例锁 -- 锁在某一个实例对象上。如果该类是单例,那么该锁也具有全局锁的概念。
      实例锁对应的就是synchronized关键字。
      全局锁 -- 该锁针对的是类,无论实例多少个对象,那么线程都共享该锁。
      全局锁对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。

    详情查看:http://www.cnblogs.com/skywang12345/p/3479202.html

  • 相关阅读:
    switch循环所支持的数据类型
    java里面main方法中的String[]args
    java基本数据类型
    Jquery自定义插件
    Jquery插件(常用的插件库)
    【JAVA SE基础篇】43.Map接口和Set接口的常用方法
    【JAVA SE基础篇】42.手工实现ArrayList和LinkedList
    【JAVA SE基础篇】41.Collection、List方法和ArrayList、LinkedList、Vector底层实现
    【JAVA SE基础篇】40.容器(集合)和泛型的介绍
    【JAVA SE基础篇】39.编译时异常
  • 原文地址:https://www.cnblogs.com/cag2050/p/7282735.html
Copyright © 2020-2023  润新知