JDK

理解Java原子性访问

泪湿孤枕 提交于 2020-12-02 17:38:38
在编程中,一个原子动作是一个有效地同时发生的动作。一个原子动作不能中途停止:它要么完全发生,要么根本不发生。在动作完成之前,原子动作的任何副作用都是不可见的。 我们已经看到,一个增量表达式,如 a++ ,并不能描述一个原子动作。即使是非常简单的表达式也可以定义复杂的动作,这些动作可以分解为其他动作。然而,你可以指定一些动作是原子的: 对于引用变量和大多数原始变量( 除了 long 和 double 以外的所有类型 )的读和写都是原子性的。 对于所有声明为 volatile 的变量(包括 long 变量和 double 变量),读和写都是原子性的。 原子操作不能交错,所以可以不用担心线程干扰。然而,这并不能消除所有同步原子动作的需要,因为内存一致性错误仍然可能发生。使用 volatile 变量可以降低内存一致性错误的风险,因为对 volatile 变量的任何写都会与该变量的后续读建立一个发生在前的关系。这意味着对 volatile 变量的更改总是对其他线程可见。更重要的是,这也意味着当一个线程读取一个 volatile 变量时,它不仅能看到 volatile 变量的最新变化,还能看到导致该变化的代码的副作用。 使用简单的原子变量访问比通过同步代码访问这些变量更有效率,但需要程序员更加小心,以避免内存一致性错误。额外的努力是否值得,取决于应用程序的大小和复杂程度。

互联网三高架构:高并发、高性能、高可用

99封情书 提交于 2020-12-02 05:38:54
点 击上方“ 掌上编程 ”,选择“ 置顶或者星标 ” 优质文章第一时间送达! 面向互联网的三高系统,最关注的软件质量属性是:性能、可用性、伸缩性、扩展性、安全性。 而构建此类系统,最常见的架构模式有:横向分层、纵向分割、分布式化、集群化、使用缓存、使用异步模式、使用冗余、自动化(发布、部署、监控)。 具体来说,可以在不同层次常用的技术有: 前端架构 浏览器优化技术:合理布局,页面缓存,减少http请求数,页面压缩,减少 cookie 传输。 1)CDN CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。 2)DNS负载均衡 3)动静分离,静态资源独立部署,动态图片独立提供服务 应用层架构 1)业务拆分 2)负载均衡 3)虚拟化服务器、容器化 4)无状态(以及分布式 Session) 分布式Session有如下几种实现方式。 1.Session复制机制 在支持Session复制的Web服务器上,通过修改Web服务器的配置,可以实现将Session同步到其它Web服务器上,达到每个Web服务器上都保存一致的Session。 优点:代码上不需要做支持和修改。 缺点:需要依赖支持的Web服务器

看看人家SpringBoot的全局异常处理多么优雅...

拈花ヽ惹草 提交于 2020-12-01 19:12:44
作者: 虚无境 https://www.cnblogs.com/xuwujing/p/10933082.html SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。 开发准备 环境要求 JDK :1.8 SpringBoot :1.5.17.RELEASE 首先还是Maven的相关依赖: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.17.RELEASE</version> <relativePath /> </parent> <dependencies> <!-- Spring Boot

java源码学习-JDK14之jpackage命令

核能气质少年 提交于 2020-12-01 10:22:23
鲁班学院 java源码学习- JDK14之jpackage命令 jpackage命令使用场景 使用场景是面向java桌面端程序打包. 可以让windows/mac 直接双击使用java程序,对系统里面有没有jdk/jre不做要求. 在这里,我们先理一下以前java桌面程序是怎么运行的: jdk8及以前 这时候的java客户端程序,主要分两部分, 一部分是可执行jar包, 一部分是电脑里面要装jdk/jre , 然后通过 java -jar XXXXX.jar 来运行程序. jdk9及以后的模块化 这是java模块化的一个分界线,其实jdk9,jdk10,我都没有用过, 我是直接尝试的jdk11. 在模块化的基础上, 项目多了一个文件, moudle-info.java 如下图所示: 如上图,所示,主要是 requires , opens , exports 这三个关键字. requires : 当前模块想要运行的话,需要哪些依赖,相当于在maven引包的基础上,要再声明一遍依赖 opens: 当前模块中的哪些包,可以被反射. 如fxml中要声明处理的controller , 每当fxml加载的时候,都会去新建一个controller实例, 所以需要opens controller的包名给javafx.fxml exports: 当前模块有哪些包,可以被引用.

StringBuffer

大兔子大兔子 提交于 2020-12-01 07:08:23
StringBuffer: StringBuffer是一个线程安全的可变字符序列。他的api和StringBuilder是差不多的。只不过,在多线程情况下,StringBuilder是线程不安全的。 StringBuffer比StringBuilder多2个成员变量:字节数组类型的toStringCache和java.io.ObjectStreamField数组类型的serialPersistentFields。 toStringCache用transient修饰,表示该字段不可序列化。他用于缓存toString最后一次返回的值,当修改的时候缓存会被清除。 serialPersistentFields 用于序列化的,序列化value,count,shared。 StringBuffer无参构造方法,默认初始化值为16. StringBuffer自己重写了length和capacity方法。 StringBuffer的扩容用的是父类的AbstractStringBuilder的扩容方法: StringBuffer线程安全,是因为很多方法都加了syncronized修饰。 StringBuffer和StringBuilder的对比: 1.StringBuilder是jdk1.5出现的,在多线程情况下,是线程不安全的; 2.StringBuffer是jdk1.0出现的,是线程安全的; 3

linux命令之信息显示与搜索文件命令

空扰寡人 提交于 2020-12-01 07:02:49
1.uname:显示系统信息 该命令用于显示系统相关的信息,比如内核版本号,硬件架构等。 参数 说明 -n(常用) 显示主机名称 -r(常用) 显示内核发行版本号 示例: 1)显示主机名 [root@boxiaoyuan /]# uname - n boxiaoyuan 2.hostname:显示或设置系统的主机名 该命令用于显示或设置系统的主机名。 常用的参数选项为-I:显示主机的所有IP地址,不依赖DNS解析,速度较快。 示例: 1)临时修改主机名 [root@boxiaoyuan / ]# hostname A [root@boxiaoyuan / ]# logout [root@A ~]# 2)永久修改主机名 [root@boxiaoyuan ~]# vim /etc/sysconfig/ network [root@boxiaoyuan ~]# 3.du:统计磁盘空间使用情况 该命令用于统计磁盘空间的使用情况,这个命令有助于找出哪个文件过多的占用了磁盘空间。 参数 说明 -s 显示文件的总大小 -h 以人类可读的方式查看大小,以K,M,G为单位 示例: 1)使用sh进行组合 [root@boxiaoyuan ~]# du -sh /usr/local/ 487M /usr/local/ 4.date:显示与设置系统时间 该命令用于显示当前系统时间或者设置系统时间。

LeetCode55|二叉树的层次遍历II

孤人 提交于 2020-12-01 02:00:53
1,问题简述 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 2,示例 例如: 给定二叉树 [ 3 , 9 , 20 , null , null , 15 , 7 ], 3 / \ 9 20 / \ 15 7 返回其自底向上的层次遍历为: [ [15,7 ], [ 9,20 ], [ 3 ] ] 3,题解思路 队列的使用 4,题解程序 import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class LevelOrderBottomTest { public static void main (String[] args) { TreeNode t1 = new TreeNode( 3 ); TreeNode t2 = new TreeNode( 9 ); TreeNode t3 = new TreeNode( 20 ); TreeNode t4 = new TreeNode( 15 ); TreeNode t5 = new TreeNode( 7 ); t1.left = t2; t1.right = t3; t3.left = t4; t3.right

java教程系列二:Java JDK,JRE和JVM分别是什么?

社会主义新天地 提交于 2020-11-30 23:55:43
多情只有春庭月,犹为离人照落花。 概述 本章主要了解JDK,JRE和JVM之间的区别。JVM是如何工作的?什么是类加载器,解释器和JIT编译器。还有一些面试问题。 Java程序执行过程 在深入了解Java内存区域之前,我们先了解Java源文件是如何执行的。 我们使用编辑器在 Simple.Java 文件中编写源代码。 程序必须编译成字节码。编译器( javac )将源代码编译为 Simple.class 文件。 此后缀为 .class 的类文件可以在任何平台/操作系统的的 JVM ( Java 虚拟机)中执行。 JVM 负责将字节码转换为机器可执行的本机机器代码。 什么是JVM? Java 虚拟机( JVM )是​​运行 Java 字节码的虚拟机。可以通过 javax 将 .java 文件编译成 .class 文件。 .class 文件包含 JVM 可解析的字节码。 事实上, JVM 只是为 Java 字节码提供了运行时环境和规范。不同的厂商提供此规范的不同实现。例如,此 Wiki 页面列出了 其它JVM实现 。 最受欢迎的 JVM 虚拟机是 Oracle 公司提供的 Hostspot 虚拟机,(前身是 Sun Microsystems,Inc .)。 JVM 虚拟机使用许多先进技术,结合了最新的内存模型,垃圾收集器和自适应优化器,为 Java 应用程序提供了最佳性能。 JVM

Java虚拟机一:运行时数据区域

霸气de小男生 提交于 2020-11-30 23:45:40
  java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域。每个区域都有各自的用途,创建和销毁时间,按照《java虚拟机规范(Java SE 7 版)》的规定,虚拟机运行时数据区域主要有以下几种: 1.程序计数器   程序计数器是很小的一块内存区域,可以看做是当前线程所执行字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能均依赖于程序计数器。在多线程中,每个线程都有一个独立的程序计数器,每个线程的程序计数器之间互不影响,即“线程私有”。同时,程序计数器是java虚拟机规范中唯一一个没有规定OutOfMemoryError的区域。 2.java虚拟机栈   虚拟机栈描述的是java方法执行的内存模型,每个方法在执行时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从被调用执行到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。虚拟机栈也是线程私有的。在Java虚拟机规范中,虚拟机栈有两种异常状况: (1)线程请求的栈深度大于虚拟机栈所允许的深度,将抛出StackOverflowError异常; (2)如果虚拟机栈可以动态扩展,但扩展时无法申请到足够的内存

JVM调优不知道怎么回答,阿里总结四大模块,学不会就背过来

我的梦境 提交于 2020-11-30 23:18:10
一个 web 应用不是一个孤立的个体,它是一个系统的部分,系统中的每一部分都会影响整个系统的性能,而并发量就是这个系统最重要的组成部分之一,它最大程度的影响着用户体验度,就像是一条高速公路,在这条高速上奔跑的汽车最关心的不就是这条高速是否会堵车啊,所以在高速设计(系统开发)的时候就要着手考虑这件事,尤其是现在的生活中,很多的朋友在面试的时候也经常被问到一个问题:JVM调优,那不清楚应该怎么处理怎么办,没关系,我来了,看完这篇文章,哪怕你从来没有调优经验也可以和面试官扯皮 个人公众号:Java架构师联盟,每日更新技术好文 话不多说,看重点 1. 常用的性能评价/测试指标 在调优之前,起码你要清楚你再进行调优的时候都要有哪些关注点吧,知己知彼才能百战不殆啊,那我们就来看一下都有哪些常用的性能测试指标 1.1 响应时间 提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。 常用操作的响应时间列表: 1.2 并发数 同一时刻,对服务器有实际交互的请求数。 和网站在线用户数的关联:1000 个同时在线用户数,可以估计并发数在 5%到 15%之间, 也就是同时并发数在 50~150 之间。 1.3 吞吐量 对单位时间内完成的工作量(请求)的量度 1.4 关系 系统吞吐量和系统并发数以及响应时间的关系: 以高速公路的通行状况: 吞吐量是每天通过收费站的车辆数目