Java多线程和并发

news/2025/2/25 15:54:11
  1. 进程和线程的区别

    • 进程是资源分配的最小单位,线程是CPU调度的最小单位
    • 所有与进程相关的资源,都被记录在PCB中
    • 进程是抢占处理机的调度单位,线程属于某个进程,共享其资源
    • 线程只由堆栈寄存器,程序计数器和TCB组成
    • 区别:
      • 线程不能看做独立应用,而进程可看做独立应用
      • 进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径
      • 线程没有独立的地址空间,多进程的程序比多线程的程序健壮
      • 进程的切换比线程的切换开销大
  2. Java进程和线程的关系

    • Java对操作系统提供的功能进行封装,包括进程和线程
    • 运行一个程序会产生一个进程,进程包含至少一个线程
    • 每个进程对应一个JVM实例,多个线程共享JVM里的堆
    • Java采用单线程编程模型,程序会自动创建主线程
    • 主线程可以创建子线程,原则上要后于子线程完成执行
  3. Thread中的start和run方法的区别

    • 调用start方法会创建一个新的子线程并启动
    • run方法只是Thread的一个普通方法的调用
  4. Thread和Runnable是什么关系

    • Thread是实现了Runnable接口的类,使得run支持多线程
    • 因类的单一继承原则,推荐使用Runnable接口
  5. 如何给run()方法传参

    • 构造函数传参
    • 成员变量传参
    • 回调函数传参
  6. 如何实现处理线程的返回值

    • 主线程等待法
    • 使用Thread类的join()方法阻塞当前线程以等待子线程处理完毕
    • 通过Callable接口实现: 通过FutureTask Or线程池获取
  7. 线程的状态

    • 新建(NEW): 创建后尚未启动的线程的状态
    • 运行(Runnable): 包含Running和Ready
    • 无限期等待(Waiting): 不会被分配CPU执行时间,需要显示被唤醒
    • 限期等待(Timed Waiting): 在一定时间后会由系统自动唤醒
    • 阻塞(Blocked): 等待获取排它锁
    • 结束(Terminated): 已终止线程的状态,线程已经结束执行
  8. sleep和wait的区别

    • sleep是Thread类的方法,wait是Object类中定义的方法
    • sleep()方法可以在任何地方使用
    • wait()方法只能在synchronized方法或synchronized块中使用
    • 本质区别:
      • Thread.sleep只会让出CPU,不会导致锁行为的改变
      • Object.wait不仅让出CPU,还会释放已经占有的同步资源锁
  9. notify和notifyAll的区别

    • 锁池EntryList
    • 等待池WaitSet
    • notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会
    • notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会
  10. yield

    • 当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示
  11. 线程安全

    • 原因
      • 存在共享数据(也称临界资源)
      • 存在多条线程共同操作这些共享数据
    • 解决办法:
      • 同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再对共享数据进行操作
  12. 互斥锁synchronized

    • 特性
      • 互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步的代码快(复合操作)进行访问,互斥性也称为操作的原子性
      • 可见性: 必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应该获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作,从而引起不一致
      • synchronized锁的不是代码,锁的都是对象
    • 分类
      • 根据获取的锁的分类: 获取对象锁和获取类锁
      • 获取对象锁的两种用法:
        • 同步代码块(synchronized(this),synchronized(类实例对象),锁是小括号()中的实例对象)
        • 同步非静态方法(synchronized method),锁是当前对象的实例对象
      • 获取类锁的两种用法:
        • 同步代码块(synchronized(类.class),synchronized(类实例对象),锁是小括号()中的类对象(Class对象))
        • 同步静态方法(synchronized static method),锁是当前对象的类对象(Class 对象)
      • 总结
        • 有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块
        • 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块的线程会被阻塞
        • 若锁住的是同一个对象,一个线程在访问对象的同步方法时,另一个访问对象同步方法的线程会被阻塞
        • 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象同步方法的线程会被阻塞
        • 同一个类的不同对象的对象锁互不干扰
        • 类锁由于也是一种特殊的对象锁,因此表现和上述1,2,3,4一致,而由于一个类只有一把对象锁,所以同一个类的不同对象使用类锁将会是同步的
        • 类锁和对象锁互不干扰
  13. synchronized的底层实现原理

    • Monitor: 每个Java对象天生自带了一把看不见的锁
  14. synchronized和ReentrantLock的区别

    • synchronized是关键字,ReentrantLock是类
    • ReentrantLock可以对获取锁的等待时间进行设置,避免死锁
    • ReentrantLock可以获取各种锁的信息
    • ReentrantLock可以灵活地实现多路通知
    • 机制: sync操作Mark Word,lock调用Unsafe类的park()方法
  15. Java内存模型(JMM)

    • JMM中的主内存
      • 存储Java实例对象
      • 包括成员变量,类信息,常量,静态变量等
      • 属于数据共享的区域,多线程并发操作时会引发线程安全问题
    • JMM的工作内存
      • 存储当前方法的所有本地变量信息,本地变量对其他线程不可见
      • 字节码行号指示器,Native方法信息
      • 属于线程私有数据区域,不存在线程安全问题

转载于:https://www.cnblogs.com/liuweiqc/p/11063930.html


http://www.niftyadmin.cn/n/711896.html

相关文章

mysql 安装与环境配置_MYSQL的安装与环境配置

1.下载好了安装包后,解压。2.创建一个同级空目录mysqlData,再进入mysql8.0.15打开my.ini配置文件。3.根据路径配置my.ini4.输入cmd,打开命令提示符,之后进入安装mysql目录的bin目录,初始化数据库,输入命令m…

SDN持续火热!未来5年复合增长率超40%

近两年,软件定义网络SDN已经成为网络世界的流行语!它的出现打破了传统网络架构的“专有”属性——分离数据层和控制层,同时具备“设备资源虚拟化”和“硬件及软件可编程”等特性,从而可构建一个更加灵活、易扩展、安全、管理更简便的网络。 S…

Tomcat突然启动不了

今天学习cookie的时候,建好了一个动态Web工程后,重启Tomcat突然启动不了。然后在网上寻找答案也没找到我的这种问题,后来只好直接寻找。最后发现了造成这个问题的原因,现将这个原因记录在这里,避免以后遇到相同的问题忘…

怎样查询网络上有几台计算机,教你如何查询自己电脑的ip地址

大家都知道,每台联网的电脑或移动设备,都是有自己的ip地址的。我们在处理某些事的时候,有时候是需要知道自己电脑的ip地址,但是很多朋友还不知道如何查询自己电脑的ip地址。下面小编给大家分享几个,查询本机电脑ip地址…

linux more 下一页_Linux中more和less命令用法

一、more命令more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的…

【新智元专访】Bengio 团队获一亿美元政府资助,用于深度学习知识革命

【人物介绍】Yoshua Bengio 从 20 世纪 80 年代开始研究神经网络。他 1991 年在麦吉尔大学获得博士学位,此后在麻省理工学院跟从 Michael Jordan 做博士后研究,之后在贝尔实验室与 Yann LeCun、Patrice Simard、Lon Bottou、Vladimir Vapnik 等人一起工作…

微型计算机指令按其操作功能不同分为,.计算机单选题.doc

计算机单选题1946年问世的首台电子数字计算机ENIAC至现代的微型机均属于VonNeumann(冯.诺伊曼)型体系结构。在冯。诺伊曼型体系结构的计算机中引进两个重要的概念,它们是采用二进制和存储程序的概念。1MB的存储空间能存储1024*512个汉字国标(GB2312—80)码.286微型计…

Spring——第一个Spring-Web项目(三层架构实现前后端数据交互)

文章目录: 1.写在开头 2.项目的大体步骤 2.1 项目大致结构 2.2 IDEA中使用Maven创建一个web 2.3 在pom.xml文件中加入依赖 2.4 创建Student实体类 2.5 创建dao接口和对应的mapper文件 2.5.1 StudentDao接口 2.5.2 StudentDao.xml 2.6 创建mybatis主配…