- 博客(46)
- 收藏
- 关注
原创 三、人人开源搭建后台管理系统
使用人人开源项目搭建后台管理系统人人开源项目码云地址:https://gitee.com/renrenio。利用renren-fast 和 renren-fast-vue实现前后分离。使用git将这两个项目进行clone。
2021-12-13 21:43:29
428
原创 MySQL逻辑架构
mysql数据库的逻辑架构整体分为三层,图示:第一层是客户端层,所包含的并不是MySQL独有的技术,它们都是服务于C/S程序或者是这些程序所需要的,诸如连接处理,身份验证、安全性等功能均在这一层处理。第二层是SQL层(SQL Layer),也叫核心服务层。在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断、SQL解析、执行计划优化、Query cache的处理以及所有内置的函数(如日前时间、加密等函数)、存储过程、视图、触发器等。第三层是存储引擎层(Storage E
2021-11-16 09:49:31
1148
1
原创 Xshell远程连接linux出现的问题
远程连接linux无法使用Password?解决方法将/etc/ssh目录下的sshd_config文件中的 PasswordAuthentication no改为yes即可。
2021-11-09 23:33:28
1622
原创 MySQL存储引擎
存储引擎就是指表的类型以及表在计算机上的存储方式。MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISA、Memory等。InnoDB存储引擎InnoDB是事务型数据库的首选引擎,支持事务ACID。InnoDB支持行级锁,行级锁可以在最大程度上支持并发。InnoDB是为处理巨大数据量的最大性能设计,InnoDB存储引擎...
2021-10-23 17:54:25
67
原创 java后端
进程和线程的区别?进程是程序的一次执行,是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位。它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),它可与同属一个进程的其他的线程共享进程所拥有的全部资源。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就
2021-07-19 16:18:08
184
原创 数据库面试题目
1. 数据库的三范式见收藏2. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。但是,如果我们使用表的类型是MylSAM,那么这条记
2021-06-20 00:03:52
80
原创 算法题目~
1. 排序算法2. 直接选择排序直接选择排序.:直接选择排序 (Straight Select Sorting) 也是一种简单的排序方法,它的基本思想是:第一次从R [0]~R [n-1]中选取最小值,与R [0]交换,第二次从R [1]~R [n-1]中选取最小值,与R [1]交换,…,第i次从R [i-1]~R [n-1]中选取最小值,与R [i-1]交换,…,第n-1次从R [n-2]~R [n-1]中选取最小值,与R [n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
2021-06-08 02:49:35
68
原创 java基础
1. 访问修饰符2. final3. 重写和继承4. 类的初始化过程5. 继承与实现6. JVM参数7. RMI8. 八种基本数据类型占空间大小9. MVC10. replaceAll11 . Object12. 序列化与反序列化13. 自动类型提升14. 装箱拆箱15. && ||16. Integer17. list中add的用法18. interface19. 构造函数
2021-06-06 23:18:02
56
1
原创 Docker无法拉取镜像
docker拉取镜像时报错:解决方法配置阿里云镜像加速器:如果配置阿里云镜像加速器之后依然报错,打开网卡配置文件,设置DNS。
2021-05-30 18:24:50
2352
原创 设计模式七大原则
1. 单一职责原则1.1 基本介绍对类来说的,即一个类应该只负责一项职责。如类 A 负责两个不同职责:职责 1,职责 2。当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2。...
2021-05-11 23:27:12
53
原创 死锁编码及定位分析
1. 死锁是什么?2. 代码class HoldThread implements Runnable { private String lockA; private String lockB; public HoldThread(String lockA, String lockB) { this.lockA = lockA; this.lockB = lockB; } @Override public void
2021-05-11 16:42:50
43
原创 生产者消费者模型之阻塞队列版
import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;class MyResource{ private volatile boolean FLAG = true; //默认开启,进行生产+消费
2021-05-11 16:24:44
72
原创 Synchronized和Lock的区别
1. 原始构成方面synchronized是JVM层面,它是JAVA的关键字,底层是通过monitor对象来完成的。Lock是API层面的具体类,它是java5以后新出的一个类。2. 使用方法synchronized 是不需要手动释放锁,当synchronized代码执行完以后,系统会自动让线程释放对锁的占用。lock就需要手动去释放锁,若没有主动的去释放锁,就可能导致死锁的现象。3. 等待是否可中断synchronized不能中断,除非是抛出了异常或者是正常执行完成。lock是可
2021-05-11 15:23:16
81
原创 公平锁/非公平锁/可重入锁/递归锁/自旋锁/独占锁/共享锁/互斥锁
1. 公平锁和非公平锁公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队打饭 ,先来后到。非公平锁:是指在多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象。对于synchronized而言 也是一种非公平锁。并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁。空参构造器:非公平锁带参构造器:公平锁2. 可重入锁(又名递归锁
2021-05-11 14:53:48
485
原创 CAS引发ABA问题
1. ABA问题2. 原子引用AtomicReferenceimport lombok.AllArgsConstructor;import lombok.Getter;import lombok.Setter;import lombok.ToString;import java.util.concurrent.atomic.AtomicReference;@Getter@Setter@AllArgsConstructor@ToStringclass User1{ priv
2021-05-10 16:08:43
62
原创 CAS
1. CAS是什么?CAS的两句话概括:1.如果线程的期望值跟物理内存的真实值一样,就更新值到物理内存当中,并返回true。2.如果线程的期望值跟物理内存的真实值不一样,返回是false,那么本次修改失败,那么此时需要重新获得主物理内存的新值。public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(5);
2021-05-10 15:00:12
142
原创 volatile是什么?
1.volatile是Java虚拟机提供的轻量级的同步机制保证可见性不能保证原子性禁止指令重排面试题:volatile是Java虚拟机提供的轻量级的同步机制,是基本上遵守了JMM的规范,主要是保证可见性和禁止指令重排,但是它并不保证原子性。2. JMMJMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步规定
2021-05-10 10:21:12
705
2
原创 六. 直接内存+执行引擎+StringTable
直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是Java堆外的、直接向系统申请的内存区间。/** * IO NIO (New IO / Non-Blocking IO) * byte[] / char[] Buffer * Stream Channel * * 查看直接内存的占用与释放 */public class BufferTest { private
2021-05-06 10:01:28
65
原创 五. 对象的实例化内存布局与访问定位
1. 堆、栈、方法区的交互关系堆、栈、方法区的交互关系:2. 方法区的基本理解《Java虚拟机规范》中明确说明:‘尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。’但对于HotSpotJVM而言,方法区还有一个别名叫做Non-heap(非堆),目的就是要和堆分开。所以,方法区可以看作是一块独立于Java堆的内存空间。方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。方法区在JVM启动时就会被创建,并且它
2021-05-05 20:12:24
54
原创 四.运行时数据区-本地方法栈(Native Method Stack)-堆-方法区
本地方法简单来讲,一个Native Method就是一个java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的
2021-05-04 19:43:09
511
1
原创 三.运行时数据区-程序计数器(PC Register)-虚拟机栈
一. 运行时数据区内部结构 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。灰色的区域为单独线程私有的,红色的为多个线程共享的。即每个线程:独立包括程序计数器、栈、本地栈。线程间共享:堆、堆外内存(永久代或元空间、代码缓存)每个JVM只有一个Runtime实例。即为运行时环境,相当于内存结构的中间的那个框框:运行时环境。二. 线程
2021-05-02 20:51:25
442
原创 二.类加载子系统
一. JVM 详细架构图二.类加载器与类的加载过程1. 类加载子系统作用类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识;ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。2. 类加载器ClassLoa
2021-05-02 18:38:34
98
原创 Stream流
题目:请按照给出数据,找出同时满足偶数ID 且 年龄大于24 且 用户名转为大写 且 用户名字母倒排序 最后只输出一个用户名字import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.Arrays;import java.util.List;@Data //get set@NoArgsConstructor // 无参构造器@...
2021-04-30 17:27:01
43
1
原创 四大函数式接口
1. Function<T, R>函数型接口public static void main(String[] args) { Function<String, Integer> function = new Function<String, Integer>() { @Override public Integer apply(String s) { return 1024.
2021-04-30 16:29:48
83
1
原创 十五. 线程池
线程池的优势:线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的主要特点为:线程复用;控制最大并发数;管理线程。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低
2021-04-30 12:18:55
64
原创 十四. BlockingQueue阻塞队列
阻塞队列阻塞:必须要阻塞/不得不阻塞阻塞队列是一个队列,在数据结构中起的作用如下图:线程1往阻塞队列里添加元素,线程2从阻塞队列里移除元素当队列是空的,从队列中获取元素的操作将会被阻塞; 当队列是满的,从队列中添加元素的操作将会被阻塞 。试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素 。试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增。在多线程领域:所谓阻塞,在某些情况下
2021-04-29 23:33:49
70
原创 十三. ReadWriteLock读写锁
ReadWriteLock读写锁多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时进行。但是有一个线程想去写共享资源,就不应该再有其他线程可以对该资源进行读或写总结: 读读----能共存 读写----不能共存 写写----不能共存//问题代码class MyCache{ private volatile Map<String,Object> map = new HashMap<>(); public vo
2021-04-29 22:53:27
103
原创 十二.semaphore(信号量)
semaphore信号量主要用于两个目的:一个是用于多个共享资源的互斥使用另一个用于并发线程数的控制。public static void main(String[] args) { Semaphore semaphore = new Semaphore(3); //模拟资源类,抢占座位 for (int i = 0; i < 6; i++) { new Thread(()->{ try
2021-04-29 15:38:10
120
原创 十一. CyclicBarrier调整线程执行顺序
CyclicBarrier调整线程执行顺序CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是, 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBarrier的await()方法。public class CyclicBarrierDemo{ private static final int NUMBER = 7; publ
2021-04-29 15:20:30
362
1
原创 十. CountDownLatch调整线程顺序
CountDownLatch可以调整线程执行顺序CountDownLatch主要有两个方法: await()和countDown()当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。public class Demo { public static void main(String[] args) throws In
2021-04-29 14:59:48
336
原创 九.获得多线程的四种方法
1. 继承Thread类class MyPrint extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"*"); } }}2. 实现Runnable接口new Thread(new Runnable() {
2021-04-29 14:34:41
139
原创 八. HashMap线程不安全
1. 举例说明HashMap线程不安全public class NotSafeDemo { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 1; i <= 30 ; i++) { new Thread(()->{ map.put(
2021-04-29 13:43:03
109
原创 七. HashSet线程不安全
1. 举例说明HashSet线程不安全public class NotSafeDemo { public static void main(String[] args) { Set<String> set = new HashSet<>(); for (int i = 1; i <= 30 ; i++) { new Thread(()->{ set.add(UUID.ran
2021-04-29 13:24:28
1196
2
原创 六. ArrayList线程不安全
1. 举例说明集合类是不安全的//一个线程的时候无论如何也不会出错public class NotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); for (String e
2021-04-29 12:44:56
56
原创 五.锁的8种情况
多线程8锁标准访问,先打印短信还是邮件停4秒在短信方法内,先打印短信还是邮件普通的hello方法,是先打短信还是hello现在有两部手机,先打印短信还是邮件两个静态同步方法,1部手机,先打印短信还是邮件两个静态同步方法,2部手机,先打印短信还是邮件1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件1.标准访问,先打印短信还是邮件class Phone{ public synchronized v.
2021-04-28 16:30:44
199
原创 四. 精确通知顺序访问
多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下: AA打印5次,BB打印10次,CC打印15次 接着AA打印5次,BB打印10次,CC打印15次高聚低合前提下,线程操作资源类判断/干活/通知多线程交互中,必须防止多线程的虚假唤醒,也即(判断只能用while,不能用if)标志位//三个操作方法的版本import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lo.
2021-04-28 15:47:07
67
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人