Threads are running in the same application,they share the same memory space in the computer.this allows them to share information seamlessly.
Synchronized关键字在语法上有两种形式:作用于程序块和方法
块同步需要一个参数来表明锁住的是哪个对象,这种方式使得任何一个方法都可以锁住任何一个对象,同步块最常用的参数就是this。
Synchronized关键字不属于方法签名的一部分,所以当子类覆盖父类方法时,Synchronized修饰符不会被继承。因此接口中的方法不能被声明为Synchronized,同样地,构造函数不能被声明为Synchronized。
线程实现取消最常见的方法都依赖于每个线程的中断状态,中断状态可以通过调用Thread.interrupt来设置,调用Thread.isInterrupted来查询,调用Thread.interrupted来查询并清除。
在Object.wati,Thread.join.,Thread.sleep中,中断状态检测是自动执行的,这些方法在遇到中断时,会抛出InterruptedException异常以中断当前的操作,使得线程可以被唤醒并执行取消操作。
正如每个Object都有一个锁,每个Object也有一套等待集合(wait set),他由wati,notify,notifyAll和Thread.interrupt方法来操作。每个对象的等待集合都是维护在JVM内部的,等待集合一直保存着那些因调用对象wait方法而被阻塞的线程,直到接受到相应的通知或者该等待集合被释放。由于等待集合和锁之间的交互机制,只有获得对象的同步锁时,才可以调用他的wait,notify,notifyAll的方法。
wait方法被调用后,会执行如下操作:
1.如果当前线程已被中断,那么该方法立即退出,然后抛出一个InterruptedException异常,否则,当前线程被阻塞。
2.JVM把该线程放入目标对象内部且无法访问的等待集合中
3.目标对象的同步锁被释放,但是这个线程所拥有的其他锁依然被这个线程保留着。
notify方法被调用后,会执行如下操作:
1.如果存在的话,JVM从目标对象内部的等待集合中任意地移除一个线程T,如果等待集合中的线程数大于1,那么哪个线程被选中完全是随机的。
2.线程T必须重新获得目标对象的目标锁,这必然导致他将被阻塞直到调用Thread.notify的线程释放该同步锁。如果其他线程在线程T获得此锁之前就获得它,那么线程T就要被一直阻塞下去。
3.线程T从执行wait的那点恢复执行
notifyAll方法被调用后,会执行如下操作:
notifyAll方法调用后执行的操作同notify类似,不同的只是等待集合中所有的线程同时都要执行那些操作,然而,由于他们必须要先获得目标对象的同步锁,所以只有一个线程可以继续操作。
interrupt方法被调用后,会执行如下操作:
如果对一个因调用了wait而被挂起的对象调用Thread.interrupt方法,那么这个方法的执行机制就和notify类似,只是在重新获得对象锁后,该方法就会抛出InterruptedException异常,并且该线程的中断状态将被设置为false.如果interrupt和notify同时发生,那么哪个操作会被执行完全是随机的,所以两种结果都是有可能的。
- 大小: 322.8 KB
分享到:
相关推荐
这是本人在学习Java 多线程时的总结归纳以及代码,希望对下载的同学有帮助!
Java多线程编程详解[归纳].pdf
java多线程实现火车售票系统以及java中的同步的实现同步块和同步方法同时同步[归纳].pdf
java实现多线程的网络并发服务器[归纳].pdf
主要介绍了Java单利模式与多线程总结归纳 的相关资料,需要的朋友可以参考下
十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五...
下面是我归纳的一些 java 多线程的面试题和答题思路。最近抽时间整理了一份Java面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是...
第8章 多线程程序设计 第9章 编程规范 第10章 网络程序设计 第11章 多媒体与图形学程序设计 第12章 数据库程序设计 第二部分 参考答案 第1章 绪论 第2章 结构化程序设计 第3章 面向对象程序设计 第4章 数组、字符串...
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
下面是我归纳的一些 java 多线程的面试题和答题思路。最近抽时间整理了一份Java面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是...
并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。 简单做一个归纳,从低成本、高性能和高扩张性的角度来说有如下处理方案: 1、HTML静态化 2、图片服务器分离 3、数据库集群和...
Java-多线程篇 Java-IO/NIO篇 Java-JDBC篇 JDK-版本篇 :maple_leaf:JVM :floppy_disk:数据库 :globe_with_meridians:Web :dvd:操作系统 :artist_palette:数据结构与算法 :scissors:设计模式 设计模式(6)适配器模式...
大厂面试常问真题整理,包含JVM、集合框架典型问题、多线程高并发、数据库高频问题。 【分享点面试经验和心得】 面试一定要学会归纳总结,一定要自己整理到自己的文档中,而不是收藏几个链接了事。毕竟看自己写的...
此实现是多线程的、可扩展的,包含多个单元测试,并且可以轻松嵌入到任何基于 Java 的图形处理管道中。 此外,它还提供了一个方便的命令行工具,用于在文本文件中的边缘列表上运行。 这个用 Java 编写的包还包括 ...
首先两阶段终止模式不是23种传统设计模式中的,它是由 黄文海在《Java多线程编程实战指南 设计模式》 中所提到的模式,现一共可归纳为36种设计模式 当我们想要结束一个线程或者关闭jvm的时候,通过此模式可以...
介绍了Java异常区分和处理的一些经验分享,主要是异常选择和使用中的一些误区总结与归纳,具有一定参考价值,需要的朋友可以了解下。
本书中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty的问题定位思路、方法、技巧,...
埃姆 本仓库是本人学习Java过程中的笔记,有些内容来自微信公众号,有些内容来自培训班机构的课程文档,有一些是来自博客,...其内容涉及Java语法,Java多线程高并发,Spring相关技术,一些中间件技术,分布式框架等。
经测试组件在处理处理6000或更多关键词的情况下单线程每秒可以达到上千万字检索的效能。 关键字识别 KFilter的关键字处理是非常灵活,它不紧识别关键字本身,对该关键字的大小写,半全角,简繁和分隔符等都会归纳到...
将分散在多个仓库中的demo项目汇总,部分项目比较老,都经测试可运行才归纳,无法运行的直接删除了 清单 演示Spring Boot Starter 演示2018 演示活动 演示网 演示安全 演示套接字:java IO,NIO,AIO 演示java:主要...