Java
文章平均质量分 81
Jonas9
Java程序猿
展开
-
白帽子讲Web安全——服务端安全
一.注入攻击安全设计原则——“数据与代码分离”原则,它可以说是专门为了解决注入攻击而生的。注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件:第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。注入类型SQL注入XML注入代码注入CRLF注入:CRLF常被用做不同语义之间的分隔符。因此通过“注入CRLF字符”,就有可能改变原有的语义。攻击手段SQL注入攻击存储过程命令执行:利用“用户自定义函数”的技巧,即UDF(User-Defi原创 2021-07-25 11:35:24 · 830 阅读 · 1 评论 -
【并发】ThreadPoolExecutor
简介ThreadPoolExecutor是Executor接口的实现类,Executors类的newFixedThreadPool等方法创建的正是ThreadPoolExecutor实例。线程池流程如果线程池当前线程数小于corePoolSize,则会创建新线程处理请求,即使当前有空闲线程;如果当前线程数大于等于corePoolSize,小于maximunPoolSize,将当前请求放入阻塞队列,如果队列已满才会新建线程处理请求;如果线程数已经大于maximunPoolSize,则根据配置的拒绝原创 2021-07-19 23:37:25 · 261 阅读 · 0 评论 -
【算法】动态规划思维框架
一. 概述动态规划问题的一般形式就是求最值,求最值的核心问题就是穷举。动态规划的特点:存在重叠子问题,如果暴力穷举则效率低下,所以需要备忘录或者dp table来优化穷举过程,避免不必要的计算。具备最优子结构,这样才能通过子问题的最值得到原问题的最值。动态规划的核心思想就是穷举求最值,但是穷举所有可行解并不容易,只有列出正确的状态转移方程才能正确地穷举。动态规划三要素即是:重叠子问题、最优子结构、状态转移方程。以下是一个思维框架(具体含义下面会示例说明),可以辅助思考状态转移方程:明确转载 2021-05-04 18:03:03 · 586 阅读 · 0 评论 -
【并发】Semaphore
使用概述Semaphore是用来控制同时访问共享资源的线程数量,有流量控制的作用。Semaphore维护一批许可,线程通过调用acquire方法来获取许可,获取不到则会发生阻塞,获取到的线程执行完自身逻辑后需要调用release方法进行释放。经典使用场景如下:线程从资源池中获取资源时需要先获取许可,释放资源时也需要释放许可,以便后续的线程可以获得许可。构造函数的第2个参数指定是否采用公平策略,公平策略侧重于保证每个线程不会发生饥饿,而非公平策略侧重于提升吞吐量。获取资源类的需求一般倾向于使用公平策略。原创 2021-01-31 11:56:17 · 95 阅读 · 0 评论 -
【并发】CyclicBarrier
使用概述CyclicBarrier的作用是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier的构造函数是CyclicBarrier(int parties),参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier自己已经到达屏障,然后当前线程被阻塞,直到所有线程到达屏障。与CountDownLatch的区别:CountDownLatch的计数器只能使用一次,而CyclicBarrier的计原创 2021-01-30 18:29:20 · 54 阅读 · 0 评论 -
【并发】CountDownLatch
使用概述CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个整型参数作为计数器,如果需要等待N个线程完成,则传入N。当调用CountDownLatch的countdown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成0。通过CountDownLatch的await方法和countdown方法的配合,我们可以让某个线程在其他N个线程执行完毕后再执行自身任务,类似于join的功能。以下是简单的代码示原创 2021-01-30 16:05:49 · 98 阅读 · 0 评论 -
【并发】原子操作类
一. 原子更新基本类型使用原子的方式更新基本类型,Atomic包提供了以下3个类:AtomicBooleanAtomicIntegerAtomicLong这三个类的用法和原理类似,这里以AtomicInteger为例详细分析下其内部原理。AtomicInteger核心属性private static final Unsafe unsafe = Unsafe.getUnsafe();//valueOffset即为字段value的内存偏移地址private static final lo原创 2021-01-30 16:04:56 · 323 阅读 · 0 评论 -
【IO】Java的getResourceAsStream的用法
通过Java的getResourceAsStream获取资源主要有以下两种方式:Class.getClassLoader.getResourceAsStream(String name): 默认是从ClassPath下获取资源,name不能以/开头,代表ClassPath下的相对路径。Class.getResourceAsStream(String name) : name 不以/开头时默认是从此类所在的包下取资源,以/开头则是从ClassPath下获取。假设此时在resources目录下有一个原创 2021-01-12 21:54:33 · 405 阅读 · 0 评论 -
【JVM】垃圾收集器与内存分配策略
1、什么是垃圾回收?垃圾回收(Garbage Collection,GC):就是释放垃圾占用的空间,防止内存泄露。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。2、垃圾在哪儿?上图可以看到程序计数器、虚拟机栈、本地方法栈都是伴随着线程而生死,这些区域不需要进行 GC。而方法区/元空间在 1.8 之后就直接放到本地内存了,假设总内存 2G,JVM 被分配内存 100M, 理论上元空间可以分配 2G-100M = 1.9G,空间还是足够的,所以这块区域也不用管。所以就只剩下堆了,ja转载 2021-01-09 11:10:21 · 146 阅读 · 0 评论 -
【JVM】元数据空间(Metaspace)
JDK8 废弃永久代永久代(PermGen)《Java虚拟机规范》定义的JVM内存结构如下图:关于方法区和永久代:在HotSpot JVM中,这次讨论的永久代,就是上图的方法区(JVM规范中称为方法区)。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。在其他JVM上不存在永久代。JDK8 永久代变化新生代:Eden+From Survivor+To Survivor老年代:OldGen永久代(方法区的实现) : PermGen-----&转载 2021-01-03 12:14:38 · 10120 阅读 · 0 评论 -
【JVM】类加载机制
一. 类加载的流程类的生命周期一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期将会经历加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。类型的生命周期如下图:加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,原创 2021-01-02 21:51:28 · 86 阅读 · 0 评论 -
【并发】Java线程
一. 线程实现HotSpot中的每个线程都是直接映射到一个操作系统原生线程来实现的,而且中间没有额外的间接结构,所以HotSpot不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议,优先级不会严格保证顺序),全权交给底下的操纵系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间、该把线程安排给哪个处理器核心去执行等,都是由操作系统完成的。二. 状态转换Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一个状态,并且可以通过特定的方法在不同状态之间转原创 2020-12-27 16:44:11 · 63 阅读 · 0 评论 -
【并发】Java内存模型
操作系统语义硬件的效率与一致性计算机在运行程序时,每条指令都是在处理器中执行的,在执行过程中势必会涉及到数据的读写。我们知道程序运行的数据是存储在主存中,这时就会有一个问题,读写主存中的数据没有处理器中执行指令的速度快,如果任何的交互都需要与主存打交道则会大大影响效率,所以就有了处理器高速缓存。在多路处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,这种系统称为共享内存多核系统,如下图所示:有了处理器高速缓存虽然解决了效率问题,但是它会带来一个新的问题:缓存一致性。在程序运行中,原创 2020-12-24 22:24:36 · 65 阅读 · 0 评论 -
【并发】volatile详解
一. volatile语义1. 保证可见性volatile保证变量对所有线程的可见性,“可见性”是指当某个线程修改了变量的值,新值对于其他线程来说是可以立即得知的,但是volatile变量无法保证“原子性”。示例如下:public class VolatileTest { public static volatile int race = 0; private static final int THREADS_COUNT = 20; private static Count原创 2020-12-19 10:56:25 · 191 阅读 · 1 评论 -
【并发】synchronized使用
一.使用方法synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。synchronized方法通过在方法声明中加入 synchronized关键字来声明 synchronized方法,如:public synchronized void accessVal(int newVal) {}synchronized 方法控制对类成员变量的访问:每个对象实例对应一把锁,每个synchronized方法都必须获得调用该方法的对象实例的锁方能执行原创 2020-12-13 14:28:15 · 122 阅读 · 0 评论 -
OpenJDK8源码分析SSL握手流程
前言说明示例项目地址:https://github.com/shenjy24/jackal-sslJDK版本:OpenJDK8。系统:MACIDE: IDEA安装OpenJDK安装JDKbrew tap AdoptOpenJDK/openjdkbrew install caskroom/cask/brew-caskbrew cask install adoptopenj...原创 2020-05-05 21:56:44 · 992 阅读 · 0 评论 -
Spring 获取属性值
Spring 获取属性值原创 2017-07-15 23:05:24 · 1582 阅读 · 0 评论 -
Git学习之本地分支和远程分支关联
第一种场景:由本地创建远程分支1.创建本地dev分支:git checkout -b dev2.创建远程dev分支:git push origin dev:dev3.分支关联:git push --set-upstream origin dev第二种场景:新建本地分支和远程分支关联git checkout origin/dev -b dev注原创 2017-07-26 12:42:42 · 361 阅读 · 0 评论 -
【并发基础】Condition详解
【并发基础】Condition详解简介接口详解await()awaitUninterruptibly()awaitNanos(long nanosTimeout)、await(long time, TimeUnit unit)、awaitUntil(Date deadline)signal()signalAll()ConditionObject实现数据结构方法详解await()addConditi...原创 2019-07-05 10:18:41 · 558 阅读 · 0 评论 -
【并发基础】ReentrantLock详解(一)
简介ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。数据结构//自定义同步器,Sync为ReentrantLock的内部类,继承AbstractQueuedSynchronizerpriva...原创 2019-07-05 10:23:59 · 201 阅读 · 0 评论 -
【并发基础】ReentrantLock详解(二)
在之前的AQS详解、Condition详解和ReentrantLock详解(一)中我们分析了同步队列、condition队列和ReentrantLock中的同步器的底层原理,最后我们通过ReentrantLock对外的接口将整个流程串一遍,思路能够更为清晰,以便对Java的并发有进一步的理解。构造方法public ReentrantLock() { sync = new Nonfair...原创 2019-07-05 10:26:35 · 121 阅读 · 0 评论 -
【并发基础】synchronized详解
目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、...转载 2019-07-06 16:53:15 · 2815 阅读 · 0 评论 -
Java 数据类型自动提升
数值计算表达式的数据类型自动提升原创 2017-07-15 19:55:42 · 435 阅读 · 0 评论