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

  问:什么是多线程死锁?

    答:同步中嵌套同步

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

原文地址:https://www.cnblogs.com/woniusky/p/10517586.html