美文网首页
Java 线程同步

Java 线程同步

作者: Tinyspot | 来源:发表于2022-09-05 13:17 被阅读0次

1. 多线程安全问题

  • 当多线程并发访问临界资源时,如果破坏原子操作,可能会造成数据不一致
  • 临界资源:共享资源(同一对象),一次仅允许一个线程使用,才可保证其正确性
  • 原子操作:不可分割的多步操作,被视作一个整体,其顺序和步骤不可打乱和缺省

1.1 同步与异步

以调用方角度来讲,如果需要等待结果返回,才能继续运行就是同步;不需要等待结果返回,就能继续运行就是异步

2. synchronized

  • Java 中的锁是对象
  • synchronized 声明方法时,放在 public 之前和之后没有区别

2.1 特点

  • 原子性
  • 可见性
  • 有序性

3. 对象锁

  • synchronized 方法是将当前对象作为锁,而 synchronized 代码块是将任意对象作为锁

3.1 同步方法

方法声明里的 synchronized 并不是锁方法,而是锁当前类的对象

public synchronized void method() {
}
synchronized (this) {
}

2.2 静态同步方法

类锁

3. synchronized 锁重入

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

锁重入也支持在父子类中继承

 /**
     * synchronized 特性:
     *  1. 可重入
     *  2. 不可中断
     *
     * 可重入锁 -> 不需要重新竞争锁
     * 1. 同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁
     * 2. 好处:避免死锁、提升封装性
     * 3. 粒度
     *      情况一:同一个方法是可重入的
     *      情况二:可重入锁不要求是同一个方法
     *      情况三:可重入锁不要求是同一个类中的
     *
     * synchronized 优先使用轻量级锁加锁,如果加锁失败了再使用重量级锁
     *
     * CAS(Compare-and-Swap),即比较并替换
     *
     * 自旋优化 -> 自旋重试
     *
     */
    static final Object obj = new Object();
    public static void method1() {
        synchronized (obj) {
            method2();
        }
    }
    public static void method2() {
        synchronized (obj) {
            // do something
        }
    }

5. println()

同一个对象的两个同步代码块也是同步的

public class PrintStream extends FilterOutputStream implements Appendable, Closeable {
  public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }
    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

相关文章

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • Java线程同步:synchronized

    Java线程同步:synchronized在Java中,synchronized关键字是用来控制线程同步的,就是在...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • 笔记-Android中的线程使用

    目录 Java中的线程 Java中如何创建线程 Java中的线程同步问题(synchronized关键字,lock...

  • Android中的线程使用与Java有何不同?

    目录 Java中的线程 Java中如何创建线程 Java中的线程同步问题(synchronized关键字,lock...

  • java同步线程(三)

    **java同步线程(三)** 基本实现方式及同步原理---释放同步监视器的锁定任何线程进入同...

  • 谈谈 java线程同步机制--标准答案

    一 java线程同步原理 java中的同步使用到了 Monitor(管程)机制java会为每个object对象分配...

  • 线程池

    Java多线程 线程的同步是Java多线程编程的重点和难点,往往让人搞不清楚什么是竞争资源、什么时候需要考虑同步,...

  • java并发

    java并发的两个核心问题: 1:线程间如何通信2:线程间如何同步 1:通行通过共享变量,Java内存模型2:同步...

  • Java自学-多线程 同步synchronized

    Java 多线程同步 synchronized 多线程的同步问题指的是多个线程同时修改一个数据的时候,可能导致的问...

网友评论

      本文标题:Java 线程同步

      本文链接:https://www.haomeiwen.com/subject/fmfdnrtx.html