多线程即案例

案例源码前往:结合源码更直观多线程案例源码icon-default.png?t=M666https://download.csdn.net/download/weixin_48019148/86223722

什么是进程?到底什么是进程?

 

 

应用程序,什么使应用程序?

可执行的软件,qq、yy、快播。在一个应用程序中,都会有进程。

什么是进程?

进程中有多个不同执行路径。

多个进程的集合

进程市执行中的册灰姑娘徐

一个操作系统可以有进程

在进程中,程序代码是怎执行的?

代码的执行顺序靠那个线程?

在进程中,一定有一个进程,这个线程就是主线程。main

什么是线程?

一个执行顺序,一个执行流程、执行路径。

总结:

使用多线程,提高程序效率。使用多线程,每个程序互不影响,因为都在自己独立运行。

什么是进程,进程就是正在运行的程序,它是线程集合

什么是线程,就是正在独立运行的一条执行路径

什么是多线程,就是为了提高程序的效率

为什么使用多线程?

例子:

 

多线程的应用场景

多线程下载、qq、爬虫、前端开发ajax(异步上传)、分布式、job(需要同时一个执行多个任务调度)、使用多线程体现程序的效率。

什么是同步?什么是异步?(很重要)

同步:代码从上往下执行(单线程) 缺点:方法一执行完才能执行方法二,方法一出错方法二不执行

 

异步:两条路径同时执行 防跳执行路径不会相互影响

 

线程常见的几种方式(程序附:thread_demo01中TreadDemo02-04)

* 1、使用继承Thread类方式
* 2、使用实现runlabe
    使用继承方式创建县城好呢?还是使用接口方式好呢?
    开发都是以面向接口编程
* 3、使用匿名内部类方式
* 4、callable
* 5、使用线程池创建(企业中)

线程中常见的集中API

什么是守护线程、非守护线程?

和main相关。

守护线程有一个特征:和主线程一起销毁

非守护线程特征:和主线程互不影响

用户线程:

  • 用户自己创建的线程,,如果主线程停止掉,不会影响用户线程

  • 用户线程也叫非守护线程

gc线程

  • 属于守护线程,和主线程一起销毁

join()的使用(程序附:thread_demo01中Tread005)

程序正在执行线程A,另一个线程B,线程A调用线程B的join()方法。作用:线程A会停止执行,等待线程B执行之后(交出我的CPU执行权),在执行。

程序附:Tread005

练习:(程序附:thread_demo01中Test01)

现在有T1,T2,T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行。

多线程的几种状态

  • 新建状态

  • 准备状态

  • 运行状态

  • 休眠状态

  • 停止状态

 

多线程之间实现同步

什么是线程安全问题?

答:当多个线程共享一个全局变量,做写操作的时候,可能会受到其他线程的干扰,导致数据有问题,这种现象叫做线程安全问题

现实中的例子:

两个男孩同时喜欢一个女孩,当两个男孩同时想约这个女孩的时候,就会发生冲突。就相当于线程安全问题。

 

案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果(程序附:thread_demo02中ThreadDemo)

线程安全问题几种解决办法

线程之间如何实现同步?

答:多个线程共享同一个全局变量,线程安全问题------保证数据的原子性

解决办法

  • synchroized--自动:同步代码块((程序附:thread_demo02中ThreadDemo))

    • 必须有一些条件:

      1、必须要有两个线程以上,需要发生同步。

      2、多个线程想同步,必须用同一吧锁。

      3、保证只有一个线程进行执行。

      缺点:效率非常低,强所得资源

      好处:解决了线程安全问题

      原理:

      1、有一个线程已经拿到了锁,其他线程已经有cpu执行全的,一直排队,等待其他线程释放锁。

      2、锁是什么时候释放?代码执行完毕或者是程序抛出异常都会被释放掉。

      3、锁已经被释放掉的话,其他线程开始获取锁进去同步中去

      4、锁的资源竞争。

      5、死锁问题

 

  • jdk1.5并发包--手动

synchroized什么地方需要考虑到加锁?

真正产生共享同一个全局变量的时候

同步代码块(程序附:thread_demo02中ThreadDemo)

同步函数:(程序附:thread_demo02中ThreadDemo01)

  • 同步函数使用的是this锁证明:如果这两个线程实现了同步说明同步函数使用的是this锁

    • 两个线程之间实现同步,一个线程使用this锁同步代码块,一个线程使用同步函数。

  • 在方法上面加上synchroized同步函数

    • 非静态同步函数

      • 同步函数使用的是this锁

    • 静态(static关键字)同步函数

      • 静态同步函数使用的是节码文件锁

加锁保证同步,同步是保证数据安全问题源子问题

分布式锁、高并发和jvm是没有任何关系

使用syn,lock都属于当前jvm中同步

多线程死锁(程序附:thread_demo02中ThreadDemo02)

多线程死锁现象,同步中嵌套同步,无法释放。一直等待,变成死锁

 

多线程的三大特性

  • 原子性:保证线程独一无二、一致性,保证线程安全问题

  • 可见性:个人理解就是当一个线程对主内存中的变量进行写操作后,主内存会通知其他线程变量值已经修改

  • 有序性:join,wait,notfi(多线程之间通讯)

java内存模型

什么是Java内存模型?Java内存结构?

  • Java内存模型属于多线程可见性jmm

  • Java内存结构属于jvm内存分配

Java内存模型决定了一个线程和另一个线程是否可见。

java内存模型:------有关线程安全问题

主内存:主要存放共享的全局变量

私有本地内存:存放本地线程私有变量

 

线程安全问题在内存中的解读:在主内存中创建一个全局变量,此时创建两个线程分别是t1和t2,当线程t1执行时他从主内存中获取到变量count的副本,count的初始值为0,此时线程t1he她同时拿到主线程的变量count且都等于0,复制存放到各自的本地私有内存中,首先,线程t1对本地私有内存中count的副本进行加一操作,那么此时t1的本地私有内存中的count副本的值为1,t1将私有本地内存的count副本的值刷新给主内存的count值,那么主内存的值此时变为1。但是同时线程t2不会接收到主线程中变量值的变化,线程t2依然会对最开始拿到的变量副本进行操作,也就是count=0。当线程t2也对count进行加1操作完成,并同时为主内存更新count值。这时就产生了线程安全问题。

Vollatile关键字(程序附:thread_demo02中TreadVolatileDemo)

作用:保证线程之间可见,但不保证原子问题.

可以使用jdk1.5中的并发包解决计数问题(程序附:thread_demo02中VolatileNoAtomic)


版权声明:本文为weixin_48019148原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。