博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaSE:Java多线程并发和线程同步
阅读量:2242 次
发布时间:2019-05-09

本文共 1283 字,大约阅读时间需要 4 分钟。

8、线程

8.1、线程简介

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

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

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

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

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类

8.3.2、实现java.lang.Runnable接口

8.4、JDK的线程同步机制

8.4.1、为何要线程同步

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

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

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

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

8.4.3、同步块的实际演示

8.4.4、同步方法的实际演示

 

你可能感兴趣的文章
直插,快排,堆排,归并排序的分析
查看>>
二叉树的各种操作(面试必备)
查看>>
oracle
查看>>
泛型与通配符详解
查看>>
BaseServiceImpl中的实现关键点
查看>>
Struts2中的session、request、respsonse获取方法
查看>>
如何理解MVC模型
查看>>
SpringMVC中乱码解决方案
查看>>
SpringMVC中时间格式转换的解决方案
查看>>
post和get请求相关知识点
查看>>
关于try finally 中的return语句的问题
查看>>
RequestBody/ResponseBody处理Json数据
查看>>
springmvc请求参数获取的几种方法
查看>>
在eclipse中创建和myeclipse一样的包结构
查看>>
Java中的IO流
查看>>
java中的关键字
查看>>
如果某个方法是静态的,它的行为就不具有多态性
查看>>
优化Hibernate所鼓励的7大措施
查看>>
Java 8系列之重新认识HashMap
查看>>
HashMap 、 ArrayList、String 重写了equals方法 而Object类(比如User)没有重写
查看>>