付威 付威的网络博客

写了一个性能比AtomicLong性能还高的计数器

今天在学习CAS的时候,想手写一个CAS的计数器,与JDK中的Atomic(AtomicLong,AtomicInteger等)系列的做个比较,本想性能应该能比JDK要差一丢丢,但却加了一个让线程让出时间片的代码,性能反而更高。 由于使用java中的Unsafe类,存在安全问题,直接使用会抛出SecurityException异常,所以Unsage无法直接在代码中调用,有两种方法可以解决这...

redis分布式锁的问题和解决

分布式锁 在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求。具体伪代码如下: public void doSomething(String userId){ User user=getUser(userId); if(user==null){ user.setUserName(...

ConcurrentHashMap源码分析


树和二叉树简介

树的定义 为了保证数据的能够有效的查询,可以使用顺序结构。为了保证数据的插入效率,我们可以使用链型结构。但在某些场合,我们需要同时兼顾查询效率和插入的效率,应该怎么做? 树(Tree)型结构是一类常用的高效的非线性的数据结构,兼顾了顺序表的查询效率和链表的插入效率。例如我们电脑中的目录结构,采用的就是一种树形结构关系。 树的具体结构形状如下图: 关于树有以下几个定义: 度:每个节...

什么是协程

协程(Coroutine)又称为微线程,我们知道线程是CPU的执行的最小单位,线程执行的最小代码单位是方法。 比如在执行的时候,一个线程从程序的入口调用Main方法,Main调用A方法,A方法又调用B方法,整个函数的执行完成的顺序是B->A->Main。这个调用的顺序是明确的,是通过压栈和出栈的方式确定的。 而协程不同, Main调用B,在调用B的过程中可以中断,Main函数...

C10K的问题

什么是C10K问题 随着互联网的普及,web的访问呈几何倍数的增长,我们知道一个请求和响应的过程的背后是连接的互换数据,最初的服务器都是基于进程/线程模型的,新到来一个TCP连接,就需要分配1个进程(或者线程)。 而进程和线程又是系统昂贵的资源,一台机器创建的线程数量和进程数量是有限的,不可能无限制的创建。 C10K的核心问题就是即使在硬件资源都满足的情况先,系统也难以承载有10000...

手写简单tomcat服务器

使用socket通信原理实现简单的http协议,代码很简单(动态类访问和NIO晚点实现,有点懒。。): ServerSocket serverSocket; public Tomcat(int port) { try { serverSocket = new ServerSocket(port); System....

手写一个jdbc数据库连接池

在Java访问mysql的时候,需要用到jdbc驱动,传统连接方式为: try { Driver mysqlDriver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance(); DriverManager.registerDriver(mysqlDriver); Connection con...

Maven私服的搭建

因为网络屏蔽的缘故,无法下载nexus包,所以这篇博客等以后有网络条件后再更新。。。

mysql安装和连接踩坑记录

原来一直使用mysql,没有自己真正的搭建,搭建也只是本地的连接,现在手上有两台电脑,想搭建一个主从的架构,在配置mysql的环节费了一点时间,其实都是很小的问题,今天记录下: mysql 安装和启动 mysql --install mysql --initialize net start mysql 安装完之后,发现忘了记密...

一篇文章说完Java的垃圾回收过程

想要了解Java的垃圾回收过程首先要理解Java堆的内存模型,简单表示如下: 从上面的图片可以看出,Java的堆内存可以简单的分为,新生代和老年代,在新生代中有分为三个区域,1个Eden区和2个Survivor区(分别叫from和to),默认比例为8:1 了解了垃圾回收的内存模型,下面就可以看下垃圾回收的过程。 创建一个新对象,判断是否大于或等于大对象的阈值(JVM...

Java的垃圾回收

Java内存模型 Java把内存大概分为:方法区,虚拟机栈,本地方法栈,堆和程序计数器5个区。 程序计数器 是一块比较小的内存空间,可以看成是一个线程的运行的指示器,是一个线程私有的内存。由于JVM的运行时通过线程抢占CPU的时间片实现的(在任何一个时刻,一个CPU只能执行一个指令),如果存在线程的上下文切换,每个线程在被移除时间片的时候都需要记录执行的位置。如果当前正在执行的是Nati...

读懂Java字节码

Java代码的运行过程 栈帧的概念 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素。每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程。 每一个栈帧在编译程序代码的时候所需要多大的局部变量表,多深的操作数栈都已经决定了 一次一个栈帧需要多少内存,不会受到程序运行期变量数据的影响,仅仅取决于具体的虚拟机实现。 一个...

一以贯之搭建神经网络的过程

在神经网络中预测识别和预测的过程中,其实都是一个函数的对应关系: 的函数关系,为了找到这个函数的关系,我们需要做大量的训练,具体的过程可以总结下面几个步骤: 获得随机矩阵w1和b1,经过一个激活函数,得到隐藏层。 获得随机矩阵w2和b2,计算出对应的预测y 利用y与样本y_的差距,有平方差和交叉熵等方式,来定义损失函数 ...

Java中的引用类型

在Java中对于变量的访问分为3种,分别为强引用,软引用和弱引用 . 在这篇博客中可以认识到三种引用的类型的特点和使用场景。 首先通过一段代码来认识三者的区别: package com.pay.utils; import Java.lang.ref.SoftReference; import Java.lang.ref.WeakReference; /** * @author li...

ThreadLocal使用

ThreadLocal是一个以当前线程为key,存储变量的map容器,能够解决线程安全问题。 首先我们先看下ThreadLocal的使用: public class ThreadLocalDemo { ThreadLocal<Integer> count = ThreadLocal.withInitial(() -> new Integer(0)); pub...

作者:付威

技术改变世界

推广信息

付威星球 知识星球
付威公众号 公众号

信息

推荐博客

如需添加到列表,请邮件到laofu_online@163.com

Other

Hosted by Coding Pages