自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 自定义线程池

线程池1.自定义线程池自定义拒绝策略接口@FunctionalInterfacepublic interface RejectPolicy<T> { /** * 自定义拒绝策略方法 * * @param queue 阻塞队列 * @param task 线程任务 */ void reject(BlockingQueue<T> queue, T task);}自定义任务队列public class

2021-01-15 17:33:12 149

原创 Volatile 原理

Volatile 原理volatile 的底层实现原理是内存屏障,Memory Barrier对 volatile 变量的写指令后会加入 写屏障对 volatile 变量的读指令前会加入 读屏障1. 如何保证可见性写屏障保证在该屏障之前的,对共享变量的改动,都同步到主存当中public void actor2() { num = 2; // volatile 变量 ready = true; // 写屏障}而读屏障保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据

2020-12-15 19:19:30 185

原创 java 内存模型

java 内存模型JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响可见性main 线程对 run 变量的修改对于 t 线程不可见,导致了 t 线程无法停止:private static boolean run = true; public static void main(S

2020-11-28 17:14:40 140

原创 条件变量

条件变量synchronized 中也有条件变量,就是等待队列 waitSet,当条件不满足时进入 waitSet 等待 ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的。使用要点:await 前需要获得锁await 执行后,会释放锁,进入 conditionObject 等待await 的线程被唤醒(或打断、或超时)重新竞争 lock 锁竞争 lock 锁成功后,从 await 后继续执行 private static Reentr

2020-11-21 19:53:12 125

原创 ReentrantLock

ReentrantLock相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入基本语法// 获取锁reentrantLock.lock();try { // 临界区 }finally { // 释放锁 reentrantLock.unlock();}可重入可重入是指同一个线程如果首次获得了这把锁,如果是可重入的锁,有权利再次获取这把锁,如果是不可

2020-11-19 20:47:08 83

原创 1. 需求分析设计方案

1. 需求分析设计方案1.1 角色分配1.1.1 管理员1.1.1.1 基本数据设置功能上传本届毕业学生及系里面所有教师 一卡通账号 文件(Excel文件),并设置初始密码为 身份证后 6位进行数据迁移,将上一届毕业学生的数据保存到相应的数据库在 学生 进入 毕业答辩阶段前三天时 系统自动为学生临时分组,并分配答辩老师管理员需要在系统中提前设置 选题开始时间,选题结束时间,检查点时间, 评审、答辩时间,管理员需要设置 最后总成绩占比,指导(权重0.xx)、评阅(权重0.xx)、答

2020-11-18 09:54:03 908

原创 多把锁

多把锁一间大屋子有两个功能:睡觉、学习,互不相干。如果只用一把锁,那么并发度很低,解决办法是准备多个房间(多个对象锁)class BigRoom { public void sleep() throws InterruptedException { synchronized (this) { System.out.println("sleeping 2 hour"); Thread.sleep(2000); } } public void study() throws

2020-11-16 16:44:40 113

原创 sleep(long n) 和 wait(long n) 的区别

sleep(long n) 和 wait(long n) 的区别sleep 是 Thread 方法,而 wait 是 Object 的方法sleep 不需要强制和 synchronized 配合使用,但 wait 需要 和 synchronized 一起用sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁park unpark 与 wait notifywait, notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 pa

2020-11-14 17:09:37 398

原创 同步模式之保护性暂停

同步模式之保护性暂停定义即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(生产者/消费者)jdk 中,join 的实现,Future的实现,采用的就是此模式因为要等待另一个的结果,因此归类到同步模式package mythread.protectstop;/** * @ClassName Sto

2020-11-08 17:04:47 210

原创 wait notify 原理

wait notify 原理Owner 线程(获取锁的线程)发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态BLOCKED 和 WAITING 的线程都处于 阻塞状态,不占用 CPU 时间片BLOCKED 线程会在Owner 线程释放锁时唤醒WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入 EntryList 重新竞争join 原理是调用者轮询检查线程 alive

2020-11-03 09:58:28 252

原创 Netty 学习记录

Netty 学习记录NioEventLoopGroup 为一个线程池,默认线程数为 8 其 顶层抽象父类为 AbstractEventExecutorGroup通过children 属性可知,线程池是通过一个 EventExecutor 数组 来管理, 通过 类图可以知道 EventExecutor 是一个线程池抽象接口。线程池中具体的线程 实现类 为 NioEventLoopNioEventLoop 中 有 selector 作为选择器, taskQueue 作为任务队列,

2020-10-31 20:49:42 76

原创 锁膨胀

锁膨胀如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。static Object obj = new Object();public static void method1() { synchronized( obj ) { // 同步块 }}当 Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁这时 Thread-1

2020-10-24 10:16:06 171 1

原创 Netty 介绍

Netty 介绍Netty 是一个异步的、基于事件驱动的网络应用框架、用以快速开发高性能、高可靠的网络 I/O 程序。Netty 主要针对在 TCP 协议下,面向 Clients 端的高并发应用,或者 Peer-to-Peer 场景下的大量数据持续传输的应用Netty 本质是一个NIO 框架,适用于服务器通讯相关的多种应用场景I/O 模型java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不

2020-10-09 15:44:08 96

原创 synchronized 原理

**synchronized 原理 **static final Object lock = new Object();static int counter = 0;public static void main(String[] args) { synchronized(lock) { counter++; }}对应的字节码为public static void main(java.lang.String[]); descriptor: ([Ljava/

2020-10-07 16:00:31 83

原创 Monitor概念

Monitor概念Monitor 被翻译为监视器或管程每个 Java 对象都可以关联一个 Monitor 对象, 如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针Monitor 结构如下刚开始 Monitor 中 Owner 为 null当 Thread-0 执行 synchronized(object) 上锁就会将 Monitor 的所有者 Owner 置为 Thread-0, 同时对象 object 中

2020-10-06 14:24:10 2697 1

原创 Java线程学习 (六)

**方法上的 synchronized **class Test { public synchronized void test() { }}// 等价于class Test { public void test() { synchronized(this) { } }}class Test { public synchronized static void test() {

2020-09-23 10:35:01 62

原创 终止模式之两阶段终止模式

终止模式之两阶段终止模式在一个线程 T1 中如何 “优雅” 终止线程 T2 ?1. 利用 isInterruptedclass TwoPhaseTermination { private Thread monitor; public void start(){ monitor = new Thread(() -> { while (true){ Thread current = Thread.curren

2020-09-16 19:01:28 241

原创 java 线程学习(五)

Java 多线程指令交错两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果有可能不为0private static int count = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 5000; i++) {

2020-09-14 20:04:02 159

原创 java 线程学习 (四)

主线程与守护线程默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其他非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。例:public static void main(String[] args) throws InterruptedException { System.out.println("开始运行"); Thread t1 = new Thread(() -> {

2020-09-07 20:48:08 117

原创 Java 线程学习 (三)

join 方法详解static int r = 0; public static void main(String[] args) throws InterruptedException { test(); } private static void test() throws InterruptedException { System.out.println("开始"); Thread t1 = new Thread( ()

2020-09-04 11:21:22 67

原创 java 线程学习(二)

线程上下文切换(Thread Context Switch)因为以下一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码线程的cpu时间片用完垃圾回收有更高优先级的线程需要运行线程自己调用了sleep、yield、wait、join、park、synchronized、lock等方法当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java中对应的概念就是程序计数器,它的作用是记住下一条jvm指令的执行地址,是线程私有的状态包括

2020-08-09 11:39:38 66

原创 java线程学习笔记

java线程运行基本原理Java Virtual Machine Stacks (Java 虚拟机栈)JVM中由堆、栈、方法区所组成,其中栈内存就是给线程使用,每个线程启动后,虚拟机就会为其分配一块栈内存。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法public class TestFrame { public static void main(String[] args) { method

2020-08-08 17:24:23 82

原创 Spring @Import 自定义ImportSelector 导入规则

首先idea创建项目, 使用maven创建工程,工程目录如下:config包下面是配置类:package config;import importselector.CustomSelector;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.

2020-07-06 09:52:56 1098

原创 Spring Bean命名规则源码学习笔记

// config包下@Configuration@ComponentScan(value = "guangmingdexin")public class SpringConfiguration {}// 测试代码public class SpringComponetScanTest { public static void main(String[] args) { // 创建容器 AnnotationConfigApplicationCo.

2020-06-17 09:18:51 224

转载 Numpy实现卷积神经网络前向运算

首先是卷积运算在numpy中通过im2col算法实现。通过将输入,卷积核拉平做矩阵乘法,得到输出。import numpy as npdef im2col(image, size, stride=1): N, H, W, C = image.shape out_h = (H - size) // stride + 1 out_w = (W - s...

2020-04-30 10:42:53 417

原创 Numpy实现神经网络-手写数字识别

使用numpy实现神经网络的前向传播,以及反向传播,使用矩阵计算加快运算速度,理论推导则在以前的博客中。

2020-04-27 17:54:29 1549 1

原创 机器学习反向传播梯度求导

机器学习反向传播梯度推导在我的前一篇文章中,已经推导出了单层感知机梯度的计算公式多层感知机梯度推导φEφWjk=(0k−tk)0k(1−0k)Wj0\frac {\varphi_E} {\varphi_{W_{j_k}}} = (0_k - t_k)0_k(1 - 0_k) W_j^0φWjk​​​φE​​=(0k​−tk​)0k​(1−0k​)Wj0​1. 链式法则:φf(x)φ...

2020-04-01 17:14:50 470

原创 机器学习多层感知机梯度推导

机器学习多层感知机梯度推导在我的前一篇文章中,已经推导出了单层感知机梯度的计算公式单层感知机梯度推导φEφwj0=(O−t)σ(x01))(1−σ(x01)))xj0\frac {\varphi_E} {\varphi_{w_{j_0}}} = (O - t) \sigma(x_0^1))(1 - \sigma(x_0^1))) {x_j^0} \\φwj0​​​φE​​=(O−t)σ...

2020-03-24 17:01:17 781 1

原创 机器学习单层感知机梯度推导

激活函数:图示:梯度求解:f(x)=11+e−xf(x) = {1 \above{0.5px} 1 + {e^{-x}}}f(x)=1+e−x1​f′(x)=e−x(1+e−x)2f'(x) = {e^{-x} \above{0.5px} ({1 + e^{-x}})^2} f′(x)=(1+e−x)2e−x​f′(x)=(1+e−x)−1(1+e−x)2f'(x) = {...

2020-03-05 18:53:03 555

空空如也

空空如也

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

TA关注的人

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