这个AI换衣项目也太惊艳了吧,看完我整个人都不好了! 以上老秦介绍了AI虚拟试衣技术和OOTDiffusion的本地部署,老秦之前就部署过,也踩了一些坑,所以这次部署比较顺利,如果大家遇到问题,可以加下老秦的AI闲聊群,有空可以帮大家看下问题。
volatile底层实现原理 前言当共享变量被声明为volatile后,对这个变量的读/写操作都会很特别,下面我们就揭开volatile的神秘面纱。1.volatile的内存语义1.1 volatile的特性一个volatile变量自身具有以下三个特性:可见性:即当一个线程修改了声明为volatile变量的值,新值对于其他要读该变量的线程来说是立即可见的。而普通变量是不能做到这一点的,普通变量的值在线程...
JVM源码调试环境搭建 前言:上篇文章我们介绍了如何在Ubuntu中编译openjdk,包括hotspotJVM,编译完之后大家就要开始阅读jvm源码了,为了让大家能够流畅地阅读和调试jvm源码,这篇介绍下如何搭建jvm源码调试环境,使之能够在IDE中调试。1.笔者环境:源码:openjdk11-hotspotIDE:clion系统:Ubuntu19.042.搭建过程:2.1将源码载入到clion首先...
Ubuntu下编译openjdk11 前言我的另一篇文章:Ubuntu下编译openjdk8 已经编译了openjdk8的版本,现在需要用到openjdk11的HotspotJVM,所以就编译一下openjdk11,把不同的部分记录下来,openjdk11的准备部分就不在赘述了,直接进入编译环节,需要准备环境的看我的编译openjdk8的文章,先把需要安装的工具安装了。1.笔者环境源码:openjdk11,大家可以...
Unsafe类源码解析 前言Unsafe,顾名思义,一个不安全的类,那么jdk的开发者为什么要设计一个不安全的类呢?这个类为什么会不安全呢?现在就让我们来揭开Unsafe类的神秘面纱。1.概述作为java开发者的我们都知道,java是没有指针的,默认是由JVM进行内存的分配与垃圾回收,那就意味着java不能直接操作内存了?其实不是的,Unsafe类通过JNI的方式访问本地的C++实现库从而使java具有了直接操...
java中锁的分类 一、java中的锁从以下几个方面进行划分类别:1.线程是否要锁住同步资源:锁住:悲观锁不锁住: 乐观锁 CAS2.锁住同步资源失败,线程是否要阻塞:阻塞不阻塞:自旋锁适应性自旋锁3.多个线程竞争同步资源的流程细节有没有区别:不锁住资源,多个线程中只有一个能修改资源成功,其他线程会重试: 无锁同一个线程执行同步资源时自动获取资源: 偏...
CAS算法 前言CAS,即 Compare And Swap(比较与交换),是一种无锁算法,基于硬件原语实现,能够在不使用锁的情况下实现多线程之间的变量同步。jdk中的java.util.concurrent.atomic包中的原子类就是通过CAS来实现了乐观锁。CAS算法过程算法涉及到三个操作数:需要读写的内存位置V需要进行比较的预期值A需要写入的新值UCAS算法解析:CAS具体执行...
volatile底层实现原理 前言当共享变量被声明为volatile后,对这个变量的读/写操作都会很特别,下面我们就揭开volatile的神秘面纱。1.volatile的内存语义1.1 volatile的特性一个volatile变量自身具有以下三个特性:可见性:即当一个线程修改了声明为volatile变量的值,新值对于其他要读该变量的线程来说是立即可见的。而普通变量是不能做到这一点的,普通变量的值在线程间传递...
Java内存模型详解 前言Java内存模型(Java Memory Model,简称JMM),即Java虚拟机定义的一种用来屏蔽各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能够达到一致的内存访问效果的内存模型。本篇文章大致设涉及到五个要点:Java内存模型的基础,主要介绍JMM抽象结构;Java内存模型中内存屏障;Java内存模型中的重排序;happens-before原则;顺序一致性内存模...
Stream流 前言这篇详细介绍了Stream流的概念,创建方式,基本操作及部分源码分析。可能有点长哈,大家看起来比较费劲,我自己写的也比较累,光码字就码了很长时间,大家看得过程中可以停下来休息下,喝个茶,斗个地主接着再来看,就安利到这里了,我也该洗洗睡了(码字确实挺累的,写文章也是很累),最后在安利下哈,个人绝得很详细的,祝大家学习愉快哈,看完就可以找到心仪小姐姐(小哥哥)。1.流的概述及相关概念ja...
方法引用 1.什么是方法引用方法引用是java8中特定情况下简化lambada表达式的一种语法糖,这里的特定情况是指当调用现有的方法时可以用方法引用替代lambada表达式,其他情况下,则不可以替代。举个栗子:public class MethodReferenceTest { public static void main(String[] args) { List<St...
函数式接口 概述java8中新增了 @FunctionalInterface 注解表示函数式接口,用注解@FunctionalInterface标识的接口都是函数式接口,函数式接口只能有一个抽象方法,但除了抽象方法,java8还允许接口中定义默认方法(声明为default的方法)和静态方法。如果一个接口只有一个抽象方法,即便我们并没有用 @FunctionalInterface 注解标注,编译器依然会将该接...
lambada表达式介绍 前言在其他语言中,函数式编程是很常见的,java8中为了支持函数式编程,新增了lambada表达式。lambada表达式其实是匿名内部类和闭包的一种符号表示,至于概念性的问题,大家不必深究,lambada表达式会用就可以了。1.为何需要lambada表达式在js中,函数的参数是另一个函数,返回值也是一个函数的情况是根常见的,因此js也是一门典型的函数式语言。而在java8以前的版本中,我...
Ubuntu下编译openjdk8 一、笔者环境1.Ubuntu18.042.openjdk8u60二、源码下载由于openjdk使用mercurial版本管理工具构建的, 所以可以使用mercurial来下载源码,但是下载速度不敢恭维,我是在openjdk官网:http://hg.openjdk.java.net/jdk8u下载的openjdk8u60版本,我已上传到github,这里给出我的github地址:https:...
Spring源码调试环境搭建 一、实验环境1.jdk1.8.0_1712.gradle-5.3.1(Spring源码使用gradle构建的,关于gradle的安装和配置使用,请读者自行上网搜一下,这里不再赘述)3.IntelliJ IDEA 2019.24.Spring-5.0.x二、环境搭建1.进入到GitHub官网并搜索spirng,找到对应的spring-framework工程,点击链接进入,如下图:2....
算法与数据结构系列之[图-概念] 前言前面我们介绍了线性表和树这两大类数据结构,线性表局限于一个直接前驱和一个直接后继,树也只能有一个直接前驱也就是父节点,当我们需要表示多对多的关系时就需要用到图这种数据结构,比如微博,微信互相关注,互加好友的社交关系就用图来表示。1.概述图(Graph)是一种数据结构,由结点和边组成,通常表示为G(V,E),其中G表示一个图,V是图G中结点的集合,结点也称顶点,可以具有零个或多个相邻元素,...
算法与数据结构系列之[哈希表] 前言前面我们介绍线性表的时候,如果要查找某个元素,比如key,就需要从表头开始,逐个比较记录a[i]和key的值是相等还是不相等,知道有相等才算查找成功,返回i。那么我们有没有一种方法不用逐个比较就能查找到要查询的元素呢?答案是肯定的,我们可以通过关键字key得到要查找记录的内存位置,这就是我们这篇要介绍的哈希表,其实哈希表算是线性存储结构的范畴,因为哈希表用到数组作为存储结构。1.什么是哈希...
算法与数据结构系列之[红黑树-下] 上篇介绍了红黑树的概述,这篇贴出红黑树的java实现代码。public class RBTree<K extends Comparable<K>, V>{ private static final boolean RED = true; private static final boolean BLACK = false; private class...
算法与数据结构系列之[红黑树-上] 前言前面我们提到,为了解决二分搜索树有时候会退化成链表的问题,科学家们提出了平衡树的概念,最早发明的AVL树就是高度平衡(所有节点的左右子节点的高度差的绝对值不超过1)的二分搜索树,但实际开发中,AVL树并不常见,工程中,常用的平衡二分搜素树是这篇我们要介绍的红黑树。那到底什么是红黑树呢?我们在这篇文章中揭晓。为了便于理解红黑树,我们先来看一种绝对的平衡树–2-3树。所谓绝对平衡树就是所有节点...
算法与数据结构系列之[平衡二叉树-AVL树-下] 上篇介绍了AVL树的概述,这篇把AVL树的java代码实现贴出来public class AVLTree<K extends Comparable<K>, V> { private class Node{ public K key; public V value; public Node left, right; ...