学习笔记
未读什么是管程(Monitor)管程(Monitor)是一种并发编程的模型和技术,用于解决多线程之间的互斥访问和条件等待的问题。它是由荷兰计算机科学家 Edsger Dijkstra 在 1971 年提出的一种同步机制。 管程提供了一种方式让多个线程能够协调彼此的执行,确保在任意时刻只有一个线程可以访问共享资源,从而避免了线程间的竞争条件(Race Condition)和数据不一致的问题。 管程通常由以下几个要素组成: 互斥锁(Mutex):用于实现对共享资源的互斥访问,保证同一时刻只有一个线程可以进入管程进行操作。 条件变量(Condition Variable):用于实现线程间的条件等待和通知机制。线程可以在条件不满足的情况下等待,并在条件满足时被唤醒继续执行。 入口队列(Entry Queue):用于存放等待访问资源的线程队列。 管程内部方法:包括对资源的操作和对条件变量的操作等。 通过管程,可以将对共享资源的访问限制在管程的范围内,线程在进入管程之前需要获得管程的互斥锁,如果资源被占用,线程将进入入口队列等待;当某个线程完成对共享资源的操作后,会释放互斥锁并唤醒等待队列中的某个线程 ...
闲谈技术
未读创建和运行线程12345678// 创建线程对象Thread t = new Thread() { public void run() { // 要执行的任务 }};// 启动线程t.start(); 例如: 123456789// 构造方法的参数是给线程指定名字,推荐Thread t1 = new Thread("t1") { @Override // run 方法内实现了要执行的任务 public void run() { log.debug("hello"); }};t1.start(); 使用 Runnable 配合 ThreadRunnablen: 可以看作是一个需要执行的任务本体 把【线程】和【任务】(要执行的代码)分开 Thread 代表线程 Runnable 可运行的任务(线程要执行的代码) 123456789Runnable runnable = new Runnable() ...
并发和并行并发和并行目标都是最大化CPU的使用率 并行:在同一时刻,多条指令在多个处理器上同时执行,无论是从微观还是宏观的角度来看二者都是一起执行的 并发:在同一时刻只能有一条指令执行,但多个进程指令快速的轮换执行,使得在宏观上具有多个进程时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干份,使多个进程快速交替执行 进程与线程进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等) 线程 一个进程之内可以分为一到多个线程。 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 windows 中进程是不活动 ...
坚持就是胜利 LeetCode地址 引用站外地址 LeetCode 844 模拟栈思想我们可以使用栈的思想来模拟这个过程。从左到右遍历字符串,当遇到字符时,将其压入栈中,当遇到 ‘#’ 时,弹出栈顶字符,表示退格。最后,比较两个字符串栈中的内容是否相等。 代码展示123456789101112131415public boolean backspaceCompare(String s, String t) { return buildString(s).equals(buildString(t));}private String buildString(String str) { StringBuilder sb = new StringBuilder(); for (char c : str.toCharArray()) { ...
数据结构与算法
未读坚持就是胜利 LeetCode地址 引用站外地址 LeetCode 27 解题思路01通过双指针方式,将不等于val的元素移动到数组的前面,定义两个双指针,slow、fast,初始值均为0。 遍历数组,当nums[fast]不等于val时,将其赋值给nums[slow],并同时将slow和fast指针都向后移动一位. 当nums[fast]等于val时,只需要将fast指针向后移动一位即可.同时slow也会随着循环的自增+1 最后返回fast的长度即可代码展示1234567891011public class ArrayElementRemoval { public static int removeElement(int[] nums, int val) { int slow = 0; // 慢指针 for (int fast = ...
数据结构与算法
未读坚持就是胜利 LeetCode地址 引用站外地址 LeetCode 69 写在前面的话这道题需要你对 算术平方根有一定的了解,如果您不知道,可以先点开学习一下平方和平方根的概念 点我查看 当我们谈论算术平方根时,需要先理解平方和平方根的概念。平方是对一个数进行乘以自身的操作。例如,2 的平方是 2 2 = 4,3 的平方是 3 3 = 9。而平方根则是指一个数的平方等于给定数的操作。例如,4 的平方根就是一个数,使得它的平方等于 4。因为 2 * 2 = 4,所以 2 就是 4 的平方根。在数学中,平方根有两种情况:正平方根和负平方根。正平方根指的是一个非负实数的平方根,例如 4 的正平方根是 2。负平方根指的是一个负数的平方根,例如 -4 的负平方根是 -2。但是在常见的数学应用中,一般只讨论非负实数的平方根。计算算术平方 ...
数据结构与算法
未读坚持就是胜利 LeetCode地址 引用站外地址 LeetCode 35 解题思路给定一个非递减排序的数组nums,和一个目标值target。要求在数组中搜索目标值的位置,如果目标值存在,则返回其索引,如果目标值不存在,返回应该插入的位置索引。 暴力解法(左闭右开)暴力解法的思路比较简单,遍历数组中的每个元素,如果当前元素大于等于目标值,说明目标值应该插入到当前位置或之前的位置,即返回当前索引。如果遍历完整个数组都没有找到大于等于目标值的元素,说明目标值应该插入到数组的末尾位置,即返回数组的长度。 12345678class Solution { public int searchInsert(int[] nums, int target) { for(int i = 0 ; i < nums.length; i ++){ ...
数据结构与算法
未读坚持就是胜利 LeetCode地址 引用站外地址 LeetCode 704 二分法要素一个题解能不能使用二分法需要满足两个提前条件 数组必须为有序 数组中无重复元素: 一旦有重复元素,使用二分法返回的元素下表可能不唯一 第一种写法解析 传进来目标值target是在一个左闭右闭的区间里,也就是在 [L , R] ,区间定义之后就决定了二分法的代码应该如何写了, while(l <= r)要使用 <= 因为 l == r 是有意义的,所以使用<= 当if(nums[mid] > target) r将要赋值为mid-1,因为当前这个num[mid]是大于target的,首先mid位置的数肯定不是target,大于那肯定就是在左边,因为数组是有序的,那接下来肯定是要在l 到 mid-1的位置进行二分查找,所以r要等于mid-11234567891011121 ...
Hexo
未读更新记录 本教程基于anzhiyu主题修改,如果是小白建议先按照鱼佬文档教程搭建好基本页面在看此教程 nav顶栏左侧应用列表ICON优化 首页顶部相关配置home_top优化 顶栏navIcon问题问题描述 点开展示 原教程中 nav.meun.item.link下只支持链接图标(也不能算是图标吧,就是图片)换成anzhiyu-icon-xxx也不行,说明此处并不支持icon的图标那就只能自己适配了,修改完后的nav可适配 阿里图标、aanzhiyi-icon、faanzhiyu主题仓库中此处只有img标签,并不支持icon图标展示因此此处也只能填写外链图片地址 修改nav.pug文件路径: themes/anzhiyu/layout/includes/header ...
更新记录 本教程基于anzhiyu二改,如果是小白建议先按照鱼佬文档教程搭建好基本页面在看此教程 相册支持Memos地址 相册细节优化(type为2展示时间) album_list和url问题 初衷:更新相册为了更方便一点,按照鱼的主题教程来搭建的目前只支持手动在 album.yml 文件中更新照片数据更新完之后还需要 在编译 、 在提交博客到仓库,为了方便更新相册数据因此接入Memos,省去在博客中操作的繁琐步骤让页面看起来更顺我心意,看不顺眼那就魔改一下下吧~ 这里在详细说明一下关于 album_list的问题,在鱼佬的相册页面配置教程中,有一个album_list和一个url属性,当album_list和url同时存在的时候,会将url中的数据覆盖掉album_list中的数据,所以我觉得要么就都展示,要么就严谨一点做个断言处 ...