线程入门

  线程与进程区别?

     

      进程是所有线程的集合,每一个线程是进程中的一条执行路径。

    

  为什么要使用多线程?

       多线程的好处提高程序的效率。

  

  多线程应用场景?

       批发发送短息,多线程下载

    

  多线程创建方式

    四种方式

     一,实现runnable接口

     二,继承thread类

     三,使用匿名内部类

     四,线程池

  

  守护线程

      

      Java中有两种线程,一种是用户线程,另一种是守护线程。

       用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止

      守护线程当进程不存在或主线程停止,守护线程也会被停止。

       使用setDaemon(true)方法设置为守护线程

  

  多线程运行状态

      

    

  什么是线程安全? 

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

   

    

   线程安全解决办法:

        

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

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

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

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

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

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

     

      synchronized 修饰方法使用锁是当前this锁。

      synchronized 修饰静态方法使用锁是当前类的字节码文件

 

    什么是多线程死锁?

         答:同步中嵌套同步,导致锁无法释放

   多线程有三大特性

      原子性,可见性,有序性

   Java内存模型

      共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见

      从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),

      本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

 

    什么是Volatile

      Volatile 关键字的作用是变量在多个线程之间可见。

      Volatile非原子性

      

    volatile与synchronized区别

      仅靠volatile不能保证线程的安全性。(原子性)

      ①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法

      ②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

      synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

      线程安全性

      线程安全性包括两个方面,①可见性。②原子性。

      从上面自增的例子中可以看出:仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

posted @ 2019-02-13 13:03  zhouwen周文  阅读(91)  评论(0)    收藏  举报