当前位置: 首页 > 编程日记 > 正文

java实现七日股票问题_七日打卡--JAVA资源限制

资源限制

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。 例如服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。

常见资源限制有:带宽的上传/下载速度

硬盘读写速度

CPU的处理速度

数据库的连接数

socket连接数等

在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源仍然在串行执行,这时候程序不仅不会加快执行反而会更慢,因为增加了上下文切换和资源调度的时间。

Java并发机制的底层实现原理

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。

volatile

Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完不知道何时会写到内存。而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存

当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量,并更新本地内存的值

Volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行:在每个volatile写操作的前面插入一个StoreStore屏障

在每个volatile写操作的后面插入一个StoreLoad屏障

在每个volatile读操作的前面插入一个LoadLoad屏障

在每个volatile读操作的后面插入一个LoadStore屏障

synchronized

在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。

Java中的每一个对象都可以作为锁,具体表现 为以下3种形式:对于普通同步方法,锁是当前实例对象,如public synchronized void method()

对于静态同步方法,锁是当前类的Class对象,如 public synchronized static void method()

对于同步方法块,锁是Synchonized括号里配置的对象,如synchronized(lock) { //… }

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。

Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在 Java SE 1.6中,锁一共有三种状态,这几个状态会随着竞争情况逐渐升级:偏向锁:大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁

轻量级锁:线程尝试使用 CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁

重量级锁:轻量级锁失败后会膨胀为重量级锁。其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的夺锁之争

原子操作

在Java中可以通过锁和循环CAS的方式来实现原子操作。

从Java 1.5开始,JDK的并发包里提供了一些类来支持原子操作,如AtomicBoolean(用原子 方式更新的boolean值)、AtomicInteger(用原子方式更新的int值)和AtomicLong(用原子方式更新的long值)。这些原子包装类还提供了有用的工具方法,比如以原子的方式将当前值自增1和自减1。CAS虽然很高效地解决了原子操作,但是存在以下问题:ABA问题:为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它 的值没有发生变化

循环时间长开销大:自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销

只能保证一个共享变量的原子操作:对多个共享变量操作时,循环CAS就无法保证操作的原子性

锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。

Java内存模型

在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步,线程之间的通信机制有两种:共享内存和消息传递:在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信

在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信

Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。

锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中;当线程获取锁时,JMM会把该线程对应的本地内存置为无效,从而使得临界区代码必须从主内存中读取共享变量。

相关文章:

Cassandra 可视化工具

2019独角兽企业重金招聘Python工程师标准>>> 最近开始接触Cassandra,这些天在cassandra的wiki发现了一些可视化工具的推荐。现在也把这个链接推荐给大家:http://wiki.apache.org/cassandra/Administration%20Tools 。 几番折腾之后&#xff0…

Linux软件的安装,更新与卸载

linux软件的安装,更新与卸载 Linux常见的安装为tar,zip,gz,rpm,deb,bin等。我们可以简单的分为三类. 第一:打包或压缩文件tar,zip,gz等,一般解压后即可&#…

因链接静态库先后顺序不正确,引起符号定义找不到

问题 项目中需要链接多个静态库,在编译的时候报错如下 sdi_io.cpp:(.text._ZN13sdi_H264EncIO7DataPopEPm0x30):对‘H264ENC_StatusGet(H264ENC_Status_t&)’未定义的引用可能原因是符号确实没有定义,而本文出现这个问题的原因是&#…

java中后台是那一部分_一套Java后台管理系统,拿来即用(附项目地址)

前言这套Base Admin是一套简单通用的后台管理系统,主要功能有:权限管理、菜单管理、用户管理,系统设置、实时日志,实时监控,API加密,以及登录用户修改密码、配置个性菜单等技术栈前端:layuijava…

基础 HTML之目录问题(相对路径和绝对路径区别)

一、相对路径和绝对路径 相对路径:以引用文件之网页所在位置为参考基础,而建立出的目录路径。因此,当保存于不同目录的网页引用同一个文件时,所使用的路径将不相同,故称之为相对。 绝对路径:以Web站点根目录…

[转]android selector 背景选择器

关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。首先android的selector是在drawable/xxx.xml中配置的。先看一下listview中的状态:把下面的XML文件保存成你自己…

牛客国庆集训派对Day6 B.Board

链接 [https://www.nowcoder.com/acm/contest/206/B] 分析 只要在n*n范围内随便找一个斜对角的一个格子去计算就知道了 具体看代码体会吧 代码 #include<bits/stdc.h> using namespace std; int a[1010][1010];int main(){int n,i,j,x,y;//freopen("in.txt",&q…

java并发读取相同的文件_高效读取大文件,再也不用担心 OOM 了!

最近阿粉接到一个需求&#xff0c;需要从文件读取数据&#xff0c;然后经过业务处理之后存储到数据库中。这个需求&#xff0c;说实话不是很难&#xff0c;阿粉很快完成了第一个版本。内存读取第一个版本&#xff0c;阿粉采用内存读取的方式&#xff0c;所有的数据首先读读取到…

Cmake 实例学习 一

一. 第一个简单的例子 在一个目录下面实现一个简单的 hello world 程序 使用cmake进行构建的时候&#xff0c;每个目录下面都要有一个 CMakeLists.txt 的文件 如果是一个稍微大的工程&#xff0c;有多级目录&#xff0c;在上级目录中的 CMakeLists.txt 中会有定义要求编译子目…

ORA-19502: write error on file xxxxx, block number xxxx

错误现象&#xff1a; 在ORACLE 10g下为表空间IGNITE_EGVSQL01增加数据文件时&#xff0c;报如下错误&#xff1a; SQL> ALTER TABLESPACE IGNITE_EGVSQL01 ADD DATAFILE /oradata/ignt/ignite_egvsql01_d02.dbf SIZE 4096M AUTOEXTEND OFF; ERROR at line 1: O…

关于Jfinal的分享代码托管GitHub

为什么80%的码农都做不了架构师&#xff1f;>>> Blog中所有的代码已经托管到github. https://github.com/b1412 此blog中关于Jfinal的代码分享不再维护。有兴趣的朋友可以关注我的github。 大家都贡献和分享一点&#xff0c;让jfinal发展的更好~ 转载于:https:…

软件发布版本的业界规则?

文章&#xff1a;8天学通MongoDB——第一天 基础入门 今天看到一篇文章说&#xff1a;业界规则&#xff0c;偶数为“稳定版”&#xff08;如&#xff1a;1.6.X&#xff0c;1.8.X&#xff09;&#xff0c;奇数为“开发版”&#xff08;如&#xff1a;1.7.X&#xff0c;1.9.X)&am…

CMake学习资料

CMake 官方 FAQ https://gitlab.kitware.com/cmake/community/wikis/FAQ CMake 官方文档 https://cmake.org/cmake/help/cmake2.4docs.html CMake 视频教程 https://www.youtube.com/watch?vCLvZTyji_Uw CMake 维基教科书 https://zh.wikibooks.org/w/index.php?titleCMake_入…

MySQL rpm包 二进制区别_Linux环境下安装mysql5.6(二进制包不是rpm格式)

一.准备:1.CentOS release 6.82.mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz3.Linux下MySQL5.6与MySQL5.7安装方法略有不同二.卸载原有的mysqlfind / -name mysqlrm -rf 上边查找到的路径&#xff0c;多个路径用空格隔开三.在安装包存放目录下执行命令解压文件tar -zxvf mysql-…

【心情】 轻装前行

为自己做一份总结吧&#xff0c;从毕业到现在~ 时间过得不快不慢&#xff0c;从毕业到现在挣扎着已经2年多了&#xff0c;2年多经历的了很多事情。 毕业回国不到一个礼拜&#xff0c;就跑到大连工作&#xff0c;一个造船厂&#xff0c;公司在长兴岛开发区&#xff0c;岛上几万人…

Android 马甲包制作流程

一、马甲包的制作流程 1.配置马甲包的applicationId以及应用名称 在app的build.gradle文件中添加马甲包的配置 android {signingConfigs {config {keyAlias ****keyPassword ****storeFile file(D:/qianming/****.jks)storePassword ****}}compileSdkVersion 25buildToolsVersi…

Cmake 交叉编译

转载自 http://zhixinliu.com/2016/02/01/2016-02-01-cmake-cross-compile/ CMake交叉编译 CMake的使用&#xff0c;以及如何将一个项目移植到Android。 CMake的用法 先让我们简单学习回顾一下cmake的基本知识&#xff1a; 基本流程 以linux平台为例&#xff0c;使用 CMak…

利用System.Uri转URL为绝对地址

在使用ASPOSE.Word生成Word文档时可以通过InsertHtml(html)来将图文信息写入Word文档(图片内嵌)&#xff0c;但要求html里图片的src是绝对全路径&#xff0c;所以需要对html进行转化。 获取html可以来自数据库数据或者通过网络抓取&#xff0c;得到之后使用System.Uri来进行替换…

idea上java接口自动化_Java接口自动化之IDEA创建及运行maven项目

本文2564字阅读约需7分钟第195次推送Maven作为一个项目管理工具&#xff0c;是一组标准集合&#xff0c;一个项目的生命周期、一个依赖管理系统&#xff0c;以下主要介绍IDEA创建及运行maven项目。01创建maven项目①打开IDEA&#xff0c;顶部菜单栏依次选择File-->New-->…

.NET面向上下文、AOP架构模式(实现)

.NET面向上下文、AOP架构模式&#xff08;实现&#xff09; 1.上下文Context、面向切面编程AOP模型分析 在本人的.NET面向上下文、AOP架构模式&#xff08;概述&#xff09;一文中&#xff0c;我们大概了解了上下文如何辅助对象在运行时的管理。在很多时候我们急需在运行时能把…

英语之弱元音Schwa

IELTS Speaking - 学会英语Schwa弱元音&#xff0c;你的口语也将充满英伦味 https://baijiahao.baidu.com/s?id1596905156544848616&wfrspider&forpc http://blog.sina.com.cn/s/blog_95e5f8a601017jr4.html https://www.guokr.com/blog/440820/ 打傻方进 百家号04-05…

工厂方法模式和抽象工厂模式

工厂方法模式和抽象工厂模式工厂方法模式抽象工厂模式总结:工厂方法模式 #include <string> #include <iostream>// Abstract class Splitter { private:/* data */ public:Splitter(/* args */);virtual ~Splitter(); public:virtual void split() 0; };Splitte…

关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题...

前段时间做一个项目&#xff0c;而项目中所有的请求都要用jquery 中的ajax请求或者post请求&#xff0c;但是开始处理一些简单操作还好&#xff0c;但是自己写了一些验证就出现问题了&#xff0c;比如表单提交的时候&#xff0c;要验证帐号的唯一性&#xff0c;所以要在submit前…

下列关于Java多线程并发控制_下列关于Java多线程并发控制机制的叙述中,错误的是...

下列叙述成都望江楼的造景手法有()。竹文化景观应体现科学性与艺术性的和谐统一&#xff0c;关于既要满足植物的生态习性&#xff0c;又能体现美学价值。在中国传统的审美趣味、多线伦理道德上&#xff0c;竹在造园中被拟人化为( )的代表。程并错误下列不属于竹文化旅游的发展趋…

一.vtun源码学习笔记

1.守护进程 &#xff08;1&#xff09;守护进程简介 守护进程,也就是我们通常所说的Daemon进程。它是一个生存期较长的进程&#xff0c;它通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。 它与普通进程相比有下面这些特殊性&#xff1a;守护进程最重要的…

获取data 数据

export function getData(el, name, val) {const prefix data-if (val) {return el.setAttribute(prefix name, val)}return el.getAttribute(prefix name) } 转载于:https://www.cnblogs.com/hss-blog/p/9781816.html

java jwks_Java SpringBoot 如何使用 IdentityServer4 作为验证服务器学习笔记

这边记录下如何使用IdentityServer4 作为 Java SpringBoot 的 认证服务器和令牌颁发服务器。本人也是新手&#xff0c;所以理解不足的地方请多多指教。另外由于真的很久没有写中文了&#xff0c;用词不太恰当的地方也欢迎新手大佬小伙伴指出&#xff0c;一起进步。另外这边令牌…

git 快速复制一个新项目

gitlab创建项目a及一个主分支master 本地整体复制已有项目b 本地克隆gitlab上新创建的项目a&#xff08;git clone gitlab地址&#xff09; 将本地克隆过来的a文件夹下的.git目录拷贝到b项目下&#xff08;cp -r .git …/b&#xff0c;注意是两个点&#xff0c;不是三个点,写两…

微信公众平台消息接口星标功能

【微信公众平台星标功能接口被撤销】微信公众平台消息接口中的星标功能&#xff0c;被悄悄的去掉了。 原因应该是有的账号在程序中大量使用星标功能&#xff0c;造成微信服务器存储记录过于宠大。 现在要继续使用星标功能&#xff0c;只能在后台手工操作。 <xml> <ToU…

国庆双节长假旅游出行必装的手机软件

长假即将来临&#xff0c;如果打算出去溜达溜达&#xff0c;透透气的朋友&#xff0c;本文可千万别错过了。今天将介绍几款应用是旅途中绝对不能缺少的&#xff0c;这些应用都非常好用、功能全面&#xff0c;是出行必备的手机软件&#xff0c;希望可以伴你度过快乐的十一长假。…