zoukankan      html  css  js  c++  java
  • JAVA多线程-实现同步

    一、什么是线程安全问题

      当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。

    二、如何解决线程安全问题

      1)如何解决多线程之间线程安全问题?
        使用多线程之间同步或使用锁(lock)。
      2)为什么使用线程同步或使用锁能解决线程安全问题呢?
        将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。
      3)什么是多线程之间同步?
        当多个线程共享同一个资源,不会受到其他线程的干扰。

    三、线程安全问题解决方法

      1)同步代码块

        同步代码块,就是将可能会发生线程安全问题的代码,给包括起来。

        synchronized(同一个数据) {
          可能会发生线程冲突问题
        }

        注意:一定要将可能冲突的代码包括起来,而不是整个代码块。包括整个代码块的话会导致整个代码变成单线程执行。

      2)同步函数(方法)

        同步函数,就是在方法上修饰synchronized 称为同步函数

        

    public synchronized void sale() {
                if (trainCount> 0) {
                    try {
                        Thread.sleep(40);
                    } catch (Exception e) {
                    }
                    System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - trainCount + 1) + "张票.");
                    trainCount--;
                }
    }

       3)静态同步函数

        方法上加上static关键字,使用synchronized 关键字修饰或者使用类.class文件。静态的同步函数使用的锁是该函数所属字节码文件对象,可以用 getClass方法获取,也可以用当前类名.class 表示。static 如果修饰方法,使用类名.方法 调用,无需实例化,所以没有this对象。

    四、多线程死锁

      即同步中嵌套同步,导致锁无法释放。

    public void run() {
            if (flag) {
                while (true) {
                    synchronized (mutex) {
                        // 锁(同步代码块)在什么时候释放? 代码执行完, 自动释放锁.
                        // 如果flag为true 先拿到 obj锁,在拿到this 锁、 才能执行。
                        // 如果flag为false先拿到this,在拿到obj锁,才能执行。
                        // 死锁解决办法:不要在同步中嵌套同步。
                        sale();
                    }
                }
            } else {
                while (true) {
                    sale();
                }
            }
        }

    五、总结

      问:什么是多线程安全?

        答:当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。做读操作是不会发生数据冲突问题。

      问:如何解决多线程之间线程安全问题?

        答:使用多线程之间同步或使用锁(lock)

      问:为什么使用线程同步或使用锁能解决线程安全问题呢?

        答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。被包裹的代码执行完成后释放锁,让后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。

      问:什么是多线程之间同步?

        答:当多个线程共享同一个资源,不会受到其他线程的干扰。

      问:什么是同步代码块?

        答:就是将可能会发生线程安全问题的代码,给包括起来。只能让当前一个线程进行执行,被包裹的代码执行完成之后才能释放所,让后才能让其他线程进行执行。

      问:多线程同步的分类?

        1.使用同步代码块

        2.使用同步函数

        3.静态同步函数

      问:同步代码块与同步函数区别?

        答:同步代码使用自定锁(明锁),同步函数使用this锁

      问:同步函数与静态同步函数区别?

        注意:有些会这样问:例如现在一个静态方法和一个非静态静态怎么实现同步?

        答:同步函数使用this锁

        静态同步函数使用字节码文件,也就是类.class

      问:什么是多线程死锁?

        答:同步中嵌套同步

        解决办法:同步中尽量不要嵌套同步

  • 相关阅读:
    Linux下压缩文件和解压缩
    原生JS随机数
    Git问题-Git warning LF will be replaced by CRLF
    mysql进程占用cpu居高不下处理
    mysql修改查询的结果包含的敏感字
    mysql 全库备份和还原
    mysql创建用户并设置权限
    Mysql-开启 SSL加密 mysql_ssl_rsa_setup
    tp6_005控制器
    ERROR 1104 (42000): The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
  • 原文地址:https://www.cnblogs.com/woniusky/p/10517586.html
Copyright © 2011-2022 走看看