JDK

AQS源码分析

感情迁移 提交于 2021-01-28 04:41:56
小弟为了进阶自己的技术。一点点挖掘自身潜力。 AQS abstractQueueSynchronizer(抽象队列同步器),是什么? 答:它是用来构建锁 或者 其他同步器组件的重量级基础框架,是整个JUC体系的基础。通过内置FIFO队列来完成获取线程取锁的排队工作,并通过一个int类型变量标识持有锁的状态; 前置知识点: 1、可重入锁(递归锁): sync(隐式锁,jvm管理)和ReentrantLock(Lock显式锁,就是手动加解)是重入锁的典型代表,为可以重复使用的锁。一个变成多个流程,可以获取同一把锁。 可重入锁概念: 是指一个线程,在外层方法获取锁的时候,再次进入该线程的内层方法会自动获取锁(必须是同一个对象),不会被阻塞。可避免死锁 举例: 递归调用同一个 sync修饰的方法或者代码块。必须是一个对象才行。一个线程调用一个对象的method1,method1 调用method2,method2调用method3, 3个方法都是被sync修饰,这样也是一个可重入锁的例子 。 再比如下面这种 static Object lock = new Object(); public void mm(){ synchronized (lock){ System.out.println("===========mm method"); synchronized (lock){

Java中的锁分类

≯℡__Kan透↙ 提交于 2021-01-28 04:00:55
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于Synchronized而言,也是一种非公平锁。由于其并不像ReentrantLock是通过AQS的来实现线程调度,所以并没有任何办法使其变成公平锁。 可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。 对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。 对于Synchronized而言,也是一个可重入锁

jdk动态代理模式

寵の児 提交于 2021-01-27 17:27:05
原理 在程序的执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类 作用 访问控制,在代理中,控制是否可以调用目标对象的方法 功能增强,可以完成在目标对象的调用是增加额外的功能 可以随时给不同的目标创建代理类 实现步骤 1 创建接口,定义目标类要完成的功能 public interface HelloService { void sayHello(); } 2 创建目标类实现接口 public class HelloImpl implements HelloService { @Override public void sayHello() { System.out.println("Hello"); } } 3 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能 public class MyInvokerHandler implements InvocationHandler { private Object target; /** * 传入目标对象,对其创建代理对象 * @param target */ public MyInvokerHandler(Object target) { this.target = target; } /** * invoke()代理类需要完成的功能 * * @param proxy

如何简单搭建自己的个人主页

感情迁移 提交于 2021-01-27 12:17:26
首先你需要有一个自己的域名,这个就不多说了,如何拥有自己的域名可以在阿里云或AWS云或者其他云平台购买一个,具体方法必应或者百度一下。 拥有域名后需要添加域名解析地址,解析地址为主机的出口公网ip,如果是物理机则需要在路由器上开启80端口的映射,如果是云主机则需要在安全组里开启80端口放行。selinux关闭,防火墙请开启80端口,如不会直接关闭。 请注意,在国内的服务器请申请备案并把备案号写在网页底部,链接一下。如服务器在国外无需。 下面是具体安装流程 如是初学者请看下面的链接有视频教程感谢这个up主有一定基础的请直接看流程能节省时间 https://www.bilibili.com/video/av15159168/ 首先需要有jdk和tomcat的安装包这个请在jdk和tomacat官网下载必应或者百度开源 下载下来最好是tar的归档文件,通过自己的方法把2个tar包放到/home/pan目录下 pan目录需要自己建立,请一定用root账号登录。 tar命令解包2个文件包,mv jdk* 这里的*表示是jdk的版本到/usr/local目录下 在/home/pan目录下使用mv重命名tomacat解压后的文件夹为 tomcat 接下来就是复杂的配置JDK环境变量环节了,注意不要敲错,vim /etc/profile 打开文件按大写G跳转到末行添加 export JAVA

ConcurrentMap原理详解

流过昼夜 提交于 2021-01-27 09:53:41
ConcurrentMap原理详解 jdk1.8 数据结构 数组+链表+红黑树 Node<K,V>{} static class Node<K,V> implements Entry<K,V> { final int hash; final K key; volatile V val; volatile Node<K,V> next; 如何线程安全 数组桶值设置和更新使用CAS算法 tabAt(Node<K,V>[] tab, int i) casTabAt(Node<K,V>[] tab, int i, Node<K,V> c, Node<K,V> v) setTabAt(Node<K,V>[] tab, int i, Node<K,V> v) 针对链表和树更新使用Synchronize 设置putVal(K key, V value, boolean onlyIfAbsent) 1、数组为空,先初始化 2、tabAt获取桶位置元素,如果为空,则casTabAt(),期望值为null,新值为新节点 3、桶位置如果存在数据,说明hash冲突了,如果当前节点hash为MOVED说明在扩容,则当前线程辅助扩容 4、如果hash值>=0,说明是链表结构 4.1循环覆盖链表所有key一样节点 4.2循环至链表尾结点时(next为null)则追加到尾结点 5

java安全编码指南之:可见性和原子性

橙三吉。 提交于 2021-01-27 06:22:59
点击 上方的 蓝字 关注我吧 程序那些事 简介 java类中会定义很多变量,有类变量也有实例变量,这些变量在访问的过程中,会遇到一些可见性和原子性的问题。这里我们来详细了解一下怎么避免这些问题。 不可变对象的可见性 不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢? 实际上,不可变对象只能保证在多线程环境中,对象使用的安全性,并不能够保证对象的可见性。 先来讨论一下可变性,我们考虑下面的一个例子: public final class ImmutableObject { private final int age; public ImmutableObject ( int age) { this .age=age; }} 我们定义了一个ImmutableObject对象,class是final的,并且里面的唯一字段也是final的。所以这个ImmutableObject初始化之后就不能够改变。 然后我们定义一个类来get和set这个ImmutableObject: public class ObjectWithNothing { private ImmutableObject refObject; public ImmutableObject getImmutableObject ( ) { return

异常处理:java.lang.ClassNotFoundException: javax.xml.bind.JAXBContext

て烟熏妆下的殇ゞ 提交于 2021-01-27 03:01:09
异常来源: 笔者在使用Java11开发 springcloud项目时,通过模块依赖运行eureka-server strater类,出现异常 Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBContext at java.base /jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~ [na:na] at java.base /jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~ [na:na] at java.base /java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~ [na:na] at java.base /java.lang.Class.forName0(Native Method) ~ [na:na] at java.base /java.lang.Class.forName(Class.java:398) ~ [na:na] at java.base /sun.reflect.generics.factory

Java9模块化指南

人盡茶涼 提交于 2021-01-26 18:25:49
1. 概述 Java9在包之上引入了一个新的抽象级别,正式称为Java平台模块系统(JPMS),简称“模块”。 在本文中,我们将介绍新系统并讨论其各个方面。 2. 什么是模块? 首先,我们需要先了解模块是什么,然后才能了解如何使用它们。 模块是一组密切相关的包和资源以及一个新的模块描述符文件。 换句话说,它是一个“Java包的包”的抽象,允许我们使代码更加 可重用 。 2.1 Packages 模块中的包与我们自Java诞生以来一直使用的Java包是相同的。 当我们创建一个模块时,我们将代码内部组织在包中,就像我们以前对任何其他项目所做的那样。 除了组织我们的代码外,还使用包来确定哪些代码可以在 模块外部公开访问 。我们将在本文后面花更多的时间讨论这个问题。 2.2 Resources 每个模块负责其资源,如媒体或配置文件。 以前,我们将所有资源放在项目的根级别,并手动管理属于应用程序不同部分的资源。 通过模块,我们可以将所需的图像和XML文件与需要的模块一起发送,从而使我们的项目更 易于管理 。 2.3 模块描述符 创建模块时,我们会包含一个描述符文件,该文件定义了新模块的几个方面: Name–我们模块的名称 依赖项–此模块依赖的其他模块的列表 公共包–我们希望从模块外部访问的所有包的列表 提供的服务–我们可以提供其他模块可以使用的服务实现 已使用的服务

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile

大城市里の小女人 提交于 2021-01-26 11:30:31
完整的错误信息: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project xinghe-interaction: Compilation failure [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki