java-异步与并发之基础
1.线程提供了一个方法:
void join()该方法允许一个线程在另一个线程上等待,直到其完成工作后才解除阻塞运行。所以join可以协调线程之间同步运行线程调用join()方法,方法后就进入阻塞状态。
2. 同步与异步:
同步运行指代码运行是有先后顺序的执行
异步运行指代码与代码间是“各干各的”互不影响
多线程并发是异步运行代码的,但是有时候又需要这些线程间的同步运行时可以使用join完成线程间的同步。
3.当一个方法的局部内部类中想引用这个方法的其他局部变量,那么该局部变量必须是final的,这是由于jvm内存分配问题,java8以后没有这个问题
4.多线程并发安全问题由于线程之间运行的是异步的,互相没有牵制,如果同时访问统一资源时就会出现“抢”的现象,由于线程发生切换现象的实际不确定性导致代码执行顺序可能未按照设计的顺序执行,出现一系列的不可预知的错误。
5.当一个方法被synchronized修饰后,该方法称为同步方法,即:多个线程不会同时对beans这个数据进行操作没有抢的问题,就不会出现并发安全问题了
在一个方法上使用synchronized修饰,那么同步监视器对象是该方法所属对象,即方法内部看到的this。
6.有效的缩小同步范围可以在保证并发安全的前提下尽可能提高并发效率:
同步块可以更精确的指定需要同步的代码片段。若希望多个线程同步执行里面的代码,就需要在同步块中指定的“同步监视器(即:)上锁对象”
必须是同一个才可以。这里由于t1,t2调用的是同一个shop的buy方法,所以这里两个线程看到的this都是这个shop对象那么这个同步块就具有了同步效果。
7.静态方法使用synchronized修饰后,该方法一定具有同步效果:
静态方法上使用synchronized修饰后,同步监视器对象是当前类的类对象。jvm在加载每个类的时候,都会实例化一个且只实例化一个class的实力用来描述这个类,而静态方法锁的就是这个对象。
8. 互斥锁:synchronized修饰不同的代码,当同步监视器对象是相同的时候这些代码片段之间就是互斥的。多个线程不能同时进到这些代码片段中一起执行。
9.使用集合工具类java.util.Collections的相关静态方法可以将现有集合或Map转换为线程安全的
synchronizedList、synchronizedSet、synchronizedMap
哪怕是线程安全的集合也不与迭代器遍历该集合互斥,所以在开发时要自行维护互斥关系。
10.线程池:线程池主要解决两个问题:
1:控制线程数量:每条线程都需要占用一部分内存,线程数量越多占用内存资源越多,并且线程多了以后CPU轮询时间会变长形成CPU过度切换,这些都会导致系统变慢,甚至瘫痪。
2:重用线程:频繁创建销毁线程也会给线程调度带来负担。尽量重用线程。减小系统开销。
当一个正在阻塞的线程被中断时,会抛出中断异常InterruptedException
shutdown()和shutdownNow():前者调用完毕后线程池不在接受新任务并且会将池中剩余任务执行完毕后自行停止。后者调用后线程池会强制中断线程池中所有线程并立即停止线程池。
我是初学者,如有更新不好的,欢迎这位大神指出,谢谢大家!
更多精彩以后更新,转载注明!
java-异步与并发之基础的更多相关文章
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
Paip.Php Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1 异步调用的实现以及角色(:调用者 提货单) F ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- Java程序设计的DOS命令基础
Java程序设计的DOS命令基础 用户使用操作系统和软件有两种方式:命令行界面(Command Line Interface,CLI)和图形界面(Graphical User Interface,GU ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Java中实现异常处理的基础知识
Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...
- JAVA面试题集之基础知识
JAVA面试题集之基础知识 基础知识: 1.C 或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- async And await异步编程活用基础
原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 await 的理解有更深一层的理解. async 和 a ...
- Java IO 文件与流基础
Java IO 文件与流基础 @author ixenos 摘要:创建文件.文件过滤.流分类.流结构.常见流.文件流.字节数组流(缓冲区) 如何创建一个文件 #当我们调用File类的构造器时,仅仅是在 ...
随机推荐
- python变量名下划线
xx: 公有变量 _x: 单前置下划线,保护变量,私有化属性或方法,不能用于'from module import *' 以单下划线开头的表示的是protected类型的变量.即保护类型只能允许其/类 ...
- SCSS 简要教程(常用指令与方法)
Sass是成熟.稳定.强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能. 特性概览 CSS书写代码规模较大的Web应用时,容易造 ...
- el-select数据量过大引发卡顿,怎么办?
本文分享自华为云社区<解决el-select数据量过大的卡顿的两种思路与一种实施方案>,作者: KevinQ. 经典问题:在测试环境好好的,怎么到正式环境就不行了? --本文:数据量变了. ...
- SAP OOALV 添加状态灯
*&---------------------------------------------------------------------* INCLUDE <icon>. T ...
- 一文精通HashMap灵魂七问,你学还是不学
如果让你看一篇文章,就可以精通HashMap,成为硬刚才面试官的高手,你学还是不学? 别着急,开始之前不如先尝试回来下面几个问题吧: HashMap的底层结构是什么? 什么时候HashMap中的链表会 ...
- python各种BUG报错解决
报错1 python学习交流群:660193417### Could not build atari-py: Command '['cmake', '..']' returned non-zero e ...
- JDBC:处理事务
1.如何实现事务 如果现在希望对 A 表和 B 表同时删除某一个 id 号的记录,使这两个sql操作组成一个事务.(成功则同时成功,否则都失败) 注意:如果 B 表 建立了引用 A 表的id外键,并指 ...
- 使用docker buildx打包发布多平台镜像
2022-07-07 个人比较喜欢影视作品,下载了大量的剧集视频,有些文件的命名不规范,就需要重新命名,之前是用的一款 renamer 客户端软件,用起来不太爽就自己做了个 bs 架构的重命名软件并开 ...
- 如何快速体验OneOS
随便逛了逛 之前有简单了解过OneOS,今天逛了下OneOS专区,发现官方终于也在宣传方面发力了啊,很多文章都非常专业,也有开发者在专区里面提问题了.也发现,部分开发者倒在了第一步,如何编译下载运行O ...
- Assembly.GetManifestResourceStream为null
想把某个项目的某个文件夹里面的ini文件生成的时候顺便生成为网站和服务文件夹项目 string _path = Path.Combine(AppDomain.CurrentDomain.BaseDir ...