JavaSE:Java多线程并发和线程同步

时间:2022-01-12 18:35:44

8、线程

8.1、线程简介

    我们通常说,线程也被称为“轻量级进程”,是包含在进程中的一个执行单元,是CPU进行任务调度的最小单位。一个进程至少有一个线程就是main函数,叫主线程,由主线程创建其它线程,在单个程序中同时运行多个线程完成不同的工作,就实现了多线程并发。比如在一些web、email、database 、DMS等应用里,在任何时候都要准备应对数目巨大的连接请求,在Server端使用多线程并发就是很必要的。

    从操作系统原理的角度讲,是不会存在多线程并发的,因为CPU资源按照时间片管理,一个时间片内只能运行一个线程,这个时间片结束后再分配另一个时间片。这可以用接力赛比喻,1分钟内四个选手先后跑完200米,那个在1分钟内这四个选手就可以看做是并发完成的。

    多线程程序中最重要的是处理共享资源的并发访问操作,比如多个窗口同时出售同一班次的车票,“车票”就是共享资源,多个用户抢购有限份额的商品,“商品”就是共享资源。Java中提供了同步块(synchronized )和同步(synchronized )方法保护共享资源,对应Linux平台就是互斥锁,这是Linux操作系统进行线程同步的一种手段。

8.2、进程与线程、多进程与多线程的关系

JavaSE:Java多线程并发和线程同步JavaSE:Java多线程并发和线程同步

8.3使用JDK进行多线程编程

         Java语言也提供了线程并发机制,程序员可以在程序中先后启动多个线程对象,每个线程完成一个任务并与其它线程并发执行。JDK中提供了两种方式设计线程类,继承java.lang.Thread类或者实现java.lang.Runnable接口,用于创建线程对象,但是Java的创建线程的代码并不是直接控制设备硬件,而是底层调用了操作系统的API,在windows系统里是调用Windows的CreateThread()接口,在Linux系统中是调用Linux系统中的pthread_create()接口。

8.3.1、继承java.lang.Thread类

JavaSE:Java多线程并发和线程同步JavaSE:Java多线程并发和线程同步

8.3.2、实现java.lang.Runnable接口

JavaSE:Java多线程并发和线程同步JavaSE:Java多线程并发和线程同步

8.4、JDK的线程同步机制

8.4.1、为何要线程同步

         如上所示,线程类中有共享资源:成员变量count,四个线程可以同时执行run方法访问此变量,因为没有进行同步控制,所以就出现了剩余票数显示非倒序、有重复的剩余票数、没有余票仍能购买的情况。JDK提供了两种方式进行线程控制:同步块和同步方法,两者其实是一样的,相当于Linux中的互斥锁。

8.4.2、同步块/同步方法的编程思想

    同步块/同步方法对共享数据的保护就像一把锁,锁住可以访问共享资源(临界区)的代码,所以可以保证一段时间内只有一个线程在执行这段代码进而访问共享资源。

    所有线程都会争抢这把锁,抢到的才能执行同步块或同步方法,其它线程阻塞;当此线程执行到锁的右大括号}释放锁后,开始新一轮争抢。就像银行事务处理时,一个是存钱的工作线程一个是取钱的工作线程,这时就必须把临界区资源”balance”锁起来,取钱的操作计算完成后才能计算存钱的操作。

8.4.3、同步块的实际演示

JavaSE:Java多线程并发和线程同步

8.4.4、同步方法的实际演示

 JavaSE:Java多线程并发和线程同步