自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 LiteLLM 运行 Llama3

Ollama 运行 Llama3,LiteLLM 代理 Llama3

2024-04-22 11:49:10 392

原创 白帽子讲Web安全——客户端安全

一.跨站脚本攻击(XSS)1.简介XSS攻击,通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。2.类型XSS根据效果的不同可以分成如下几类。(1) 反射型XSS反射型XSS只是简单地把用户输入的数据“反射”给浏览器。也就是说,黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”(Non-persistent XSS)。(2) 存储型XSS存储型XSS会把用户输入的数据“存储”在服务器端。这种X

2021-07-27 21:43:53 610

原创 白帽子讲Web安全——服务端安全

一.注入攻击安全设计原则——“数据与代码分离”原则,它可以说是专门为了解决注入攻击而生的。注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件:第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。注入类型SQL注入XML注入代码注入CRLF注入:CRLF常被用做不同语义之间的分隔符。因此通过“注入CRLF字符”,就有可能改变原有的语义。攻击手段SQL注入攻击存储过程命令执行:利用“用户自定义函数”的技巧,即UDF(User-Defi

2021-07-25 11:35:24 831 1

原创 【并发】ThreadPoolExecutor

简介ThreadPoolExecutor是Executor接口的实现类,Executors类的newFixedThreadPool等方法创建的正是ThreadPoolExecutor实例。线程池流程如果线程池当前线程数小于corePoolSize,则会创建新线程处理请求,即使当前有空闲线程;如果当前线程数大于等于corePoolSize,小于maximunPoolSize,将当前请求放入阻塞队列,如果队列已满才会新建线程处理请求;如果线程数已经大于maximunPoolSize,则根据配置的拒绝

2021-07-19 23:37:25 262

转载 【算法】动态规划思维框架

一. 概述动态规划问题的一般形式就是求最值,求最值的核心问题就是穷举。动态规划的特点:存在重叠子问题,如果暴力穷举则效率低下,所以需要备忘录或者dp table来优化穷举过程,避免不必要的计算。具备最优子结构,这样才能通过子问题的最值得到原问题的最值。动态规划的核心思想就是穷举求最值,但是穷举所有可行解并不容易,只有列出正确的状态转移方程才能正确地穷举。动态规划三要素即是:重叠子问题、最优子结构、状态转移方程。以下是一个思维框架(具体含义下面会示例说明),可以辅助思考状态转移方程:明确

2021-05-04 18:03:03 593

原创 【并发】Semaphore

使用概述Semaphore是用来控制同时访问共享资源的线程数量,有流量控制的作用。Semaphore维护一批许可,线程通过调用acquire方法来获取许可,获取不到则会发生阻塞,获取到的线程执行完自身逻辑后需要调用release方法进行释放。经典使用场景如下:线程从资源池中获取资源时需要先获取许可,释放资源时也需要释放许可,以便后续的线程可以获得许可。构造函数的第2个参数指定是否采用公平策略,公平策略侧重于保证每个线程不会发生饥饿,而非公平策略侧重于提升吞吐量。获取资源类的需求一般倾向于使用公平策略。

2021-01-31 11:56:17 96

原创 【并发】CyclicBarrier

使用概述CyclicBarrier的作用是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier的构造函数是CyclicBarrier(int parties),参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier自己已经到达屏障,然后当前线程被阻塞,直到所有线程到达屏障。与CountDownLatch的区别:CountDownLatch的计数器只能使用一次,而CyclicBarrier的计

2021-01-30 18:29:20 56

原创 【并发】CountDownLatch

使用概述CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个整型参数作为计数器,如果需要等待N个线程完成,则传入N。当调用CountDownLatch的countdown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成0。通过CountDownLatch的await方法和countdown方法的配合,我们可以让某个线程在其他N个线程执行完毕后再执行自身任务,类似于join的功能。以下是简单的代码示

2021-01-30 16:05:49 99

原创 【并发】原子操作类

一. 原子更新基本类型使用原子的方式更新基本类型,Atomic包提供了以下3个类:AtomicBooleanAtomicIntegerAtomicLong这三个类的用法和原理类似,这里以AtomicInteger为例详细分析下其内部原理。AtomicInteger核心属性private static final Unsafe unsafe = Unsafe.getUnsafe();//valueOffset即为字段value的内存偏移地址private static final lo

2021-01-30 16:04:56 326

原创 【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

转载 【JVM】垃圾收集器与内存分配策略

1、什么是垃圾回收?垃圾回收(Garbage Collection,GC):就是释放垃圾占用的空间,防止内存泄露。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。2、垃圾在哪儿?上图可以看到程序计数器、虚拟机栈、本地方法栈都是伴随着线程而生死,这些区域不需要进行 GC。而方法区/元空间在 1.8 之后就直接放到本地内存了,假设总内存 2G,JVM 被分配内存 100M, 理论上元空间可以分配 2G-100M = 1.9G,空间还是足够的,所以这块区域也不用管。所以就只剩下堆了,ja

2021-01-09 11:10:21 146

转载 【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 10148

原创 【JVM】类加载机制

一. 类加载的流程类的生命周期一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期将会经历加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。类型的生命周期如下图:加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,

2021-01-02 21:51:28 87

原创 【并发】Java线程

一. 线程实现HotSpot中的每个线程都是直接映射到一个操作系统原生线程来实现的,而且中间没有额外的间接结构,所以HotSpot不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议,优先级不会严格保证顺序),全权交给底下的操纵系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间、该把线程安排给哪个处理器核心去执行等,都是由操作系统完成的。二. 状态转换Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一个状态,并且可以通过特定的方法在不同状态之间转

2020-12-27 16:44:11 64

原创 【并发】Java内存模型

操作系统语义硬件的效率与一致性计算机在运行程序时,每条指令都是在处理器中执行的,在执行过程中势必会涉及到数据的读写。我们知道程序运行的数据是存储在主存中,这时就会有一个问题,读写主存中的数据没有处理器中执行指令的速度快,如果任何的交互都需要与主存打交道则会大大影响效率,所以就有了处理器高速缓存。在多路处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,这种系统称为共享内存多核系统,如下图所示:有了处理器高速缓存虽然解决了效率问题,但是它会带来一个新的问题:缓存一致性。在程序运行中,

2020-12-24 22:24:36 65

原创 【并发】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 192 1

原创 【并发】synchronized使用

一.使用方法synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。synchronized方法通过在方法声明中加入 synchronized关键字来声明 synchronized方法,如:public synchronized void accessVal(int newVal) {}synchronized 方法控制对类成员变量的访问:每个对象实例对应一把锁,每个synchronized方法都必须获得调用该方法的对象实例的锁方能执行

2020-12-13 14:28:15 126

原创 网络是怎样连接的——浏览器生成消息过程

一. 浏览器生成消息1. 生成 HTTP 请求消息1.1 URL 格式1.2 浏览器解析URL1.3 省略文件名的情况(a)http://www.lab.glasscom.com/dir/以/结尾代表/dir/后面本来应该有的文件名被省略了,没有文件名,服务器怎么知道要访问哪个文件呢?**其实,我们会在服务器上事先设置好文件名省略时要访问的默认文件名。**这个设置根据服务器不同而不同,大多数情况下是index.html或者default.htm之类的文件名。因此,像前面这样省略文件名时,服

2020-08-02 15:01:46 458

原创 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 1001

原创 【Jedis详解】Cluster数据读写

1. 写入数据JedisCluster设置string类型数据的set方法如下:@Overridepublic String set(final String key, final String value) { return new JedisClusterCommand<String>(connectionHandler, maxAttempts) { ...

2020-02-27 16:35:41 2927

原创 【Jedis详解】Cluster连接创建与关闭

1. 创建连接使用Jedis操作Redis Cluster,我们需要创建JedisCluster对象,再通过JedisCluster对象实例操作数据,代码一般如下:// 初始化所有节点(例如6个节点)Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>() {{ add(new Ho...

2020-02-27 16:22:05 5409

原创 【Jedis详解】Sentinel连接创建与关闭

本篇主要讲解Jedis源码中连接Sentinel获取连接池及其关闭的部分,Redis Sentinel的相关内容大家可以参考《Redis运维与开发》这本书,个人觉得是非常好的Redis入门书籍。1. Sentinel连接池初始化通过Jedis连接Sentinel我们需要先构建JedisSentinelPool,通过它再获取到Jedis实例,然后就可以进行Redis操作,代码大体如下:...

2020-02-27 15:32:01 3175

转载 【并发基础】synchronized详解

目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、...

2019-07-06 16:53:15 2815

原创 【并发基础】ReentrantLock详解(二)

在之前的AQS详解、Condition详解和ReentrantLock详解(一)中我们分析了同步队列、condition队列和ReentrantLock中的同步器的底层原理,最后我们通过ReentrantLock对外的接口将整个流程串一遍,思路能够更为清晰,以便对Java的并发有进一步的理解。构造方法public ReentrantLock() { sync = new Nonfair...

2019-07-05 10:26:35 122

原创 【并发基础】ReentrantLock详解(一)

简介ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。数据结构//自定义同步器,Sync为ReentrantLock的内部类,继承AbstractQueuedSynchronizerpriva...

2019-07-05 10:23:59 201

原创 【并发基础】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 559

原创 【并发基础】AQS详解

【并发基础】AQS详解简介核心数据结构自定义同步器源码解析独占式同步状态的获取和释放独占式获取tryAcquire(int)addWaiter(Node)acquireQueued(Node, int)shouldParkAfterFailedAcquire(Node, Node)parkAndCheckInterrupt小结独占式释放unparkSuccessor(Node)共享式同步状态的获取...

2019-07-05 10:12:22 308

原创 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

原创 Spring 获取属性值

Spring 获取属性值

2017-07-15 23:05:24 1583

原创 Java 数据类型自动提升

数值计算表达式的数据类型自动提升

2017-07-15 19:55:42 437

原创 Ubuntu更换阿里源

Ubuntu、阿里源

2017-06-25 19:40:52 344

原创 Sublime JSHint安装

1、通过package control安装Sublimelinter,然后安装SublimeLinter-jshint。 2、Sublimelinter需要node.js支持,到 https://nodejs.org 下载安装。 3、安装nodejs之后,使用其包管理器npm安装 jshint,命令如下: npm install -g jshint 注:由于npm的默认仓库在国外,可能出现安

2016-12-03 16:30:58 404

原创 Javascript: splice方法

splice方法 (1)删除:删除任意数量的项,只需指定2个参数:要删除的第一项位置和要删除的项数。 例如,splice(0,2) 会删除数组的前两项。注:splice()的删除操作会对原数组产生影响,而截取操作slice()不会对原数组产生影响。(2)插入:向数组指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,一直任

2016-10-23 00:55:36 433

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除