高并发编程基础篇

    并发编程的基础,应该是离不开多线程,本问先简单介绍一下多线程的基础。

一、多线程实现方式

    总所周知,有四种创建线程的方法,分别是:

   1.继承Thread类 重写run方法

   2.实现Runnable接口,重写run方法

   3.匿名内部类方式

   4.线程池

   总的来说,都是围绕Thread类和Runnable接口来进行操作的,工作中使用最多的应该是线程池(之后介绍)。

二、线程的概念以及线程和进程的关联

        进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程是程序执行的最小单位。举个栗子:高铁站就是一个进程,高铁站负责人(系统)会对整个高铁站进行资源分配和调度,线程则是每一条铁路。

三、线程的分类

        分为用户线程和守护线程,用户线程:就是用户自定义创建的线程,主线程停止,用户线程不会停止;守护线程:守护线程当进程不存在或主线程停止,守护线程也会被停止。

        守护线程的用法也很简单,使用setDaemon(true)方法设置为守护线程,需要在start()之前设置好,否则会设置守护线程失败,而当做用户线程使用。

四、线程的生命周期

       新建状态、就绪状态、运行状态、阻塞状态及死亡状态。

       就绪、运行、阻塞三种状态可以来回切换,如:就绪状态转为运行状态,运行转阻塞,阻塞可以再转回运行状态。只要不走到死亡,它就一直存活。

五、java内存模型

       简称JMM,决定一个线程对共享变量写入时,能对另一个线程可见。一个共享资源存放在主内存中,每个线程会保存一份该共享资源的副本,当某一线程对副本进行操作的时候,将更改的资源刷新到主内存,然后通知其他线程刷新本地内存中的副本,这样就保证了可见性。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

     三大特性。

     1、原子性

         一个操作时不可中断的。即使是在多个线程一起执行的时候,一个操作一单开始,就不会被其他线程干扰。

     2、可见性

当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。在使用全局共享变量一般都会使用volatile关键字保证可见性,及时将资源刷到主内存中,而且会禁止重排序。

    3、有序性

对于一个线程来说,执行代码都是按照从先往后依次执行的。但是,在并发时,程序的执行可能就会出现乱序。产生乱序的原因是因为程序在执行时,可能会进行指令重排。

所谓重排序,就是会对没有依赖关系的指令进行重排序,以提高效率。类似流水线的工作原理,比如有两条指令,指令A和指令B,指令A=a+b,指令B=c+d,这两条指令没有任何的依赖关系,那么编译器和处理器可能会对操作做重排序。如果指令A=a+b,指令B=A+c,那么这两条指令就有依赖关系,就不会进行重排序。

 

发布了18 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_32285039/article/details/103277523