4.7k 4 分钟

# 中缀转后缀表达式 | | | | | | | | --- a + b a + b - c a * b + c a + b * c # 分析 a + b | | | | | | | | ---- a + b ab+ 首先 遍历到 a 是一个 数字 就加入字符串,再遍历到 + 是个运算符 就加入到 队列中 然后再遍历 到 b 是个数字就加入字符串中,然后从队列中取出运算符并进拼接字符串 # 分析 a + b - c | | | | | | | | --- a + b - c 遍历到 a 是个数字 加入到字符串中 ,再遍历到 + 是个 运算符加入到 队列中,再遍历到 b...
1.2k 1 分钟

# 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例 2: 输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 ->...
121 1 分钟

1. 点击 Project Structure... 点击 + 号 2. 指定到 java 目录下 此时 java 目录就会被改变如下图 而且我们可以对此创建 js,jsp 文件了 如果想要改回来则将其对应的添加的那个包删除即可 删除后 就会变成原来的不能创建 js,jsp 的文件了
18k 16 分钟

# JVM 内存结构 # 什么是 JVM Java Virtual Machine:Java 虚拟机,用来保证 Java 语言跨平台 Java 虚拟机可以看做是一台抽象的计算机,如同真实的计算机那样,它有自己的指令集以及各种运行内存区域 Java 虚拟机与 Java 语言并没有必然的联系,它只与特定的二进制文件格式 (class 文件格式) 所关联 Java 虚拟机就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行 # 为什么要学习 JVM 我们知道一个 java 应用程序上线后,肯定会时不时的出现一些问题,除去网络 / 系统本身的问题很多时候...
4k 4 分钟

# 阻塞队列 - 双锁实现 3 - 最后阶段 到此 我们还没有讲述完 双锁实现 因为 还有一段 最为 精华 的代码没有加上,是什么呢? 我们当时为什么使用 双锁来实现? 使用双锁 它的性能 要比使用 单锁 高,因为 两个线程之间是可以同时 获取自己的锁 然后去同时工作 而不用等对方 我们接下来的优化就是 减少 唤醒时 加锁的次数 也就是 offer 方法 中唤醒时 我尽量要把它的加锁次数 降到最低 类似的 poll 也是 我们考虑如下情况: 假设来了 3 个 poll 线程 poll_1 poll_2 poll_3 它们要去获取元素但是队列是空的,如下代码成立 while(isEmpty())...
1k 1 分钟

# 阻塞队列 - 双锁实现 2 - 解决 1 的问题 我们在 阻塞队列 - 双锁实现 1 中最后 编程的 唤醒线程的操作虽然 解决了唤醒线程时的报错问题但是 还是存在着 死锁的问题 我们先抛开 代码逻辑 只看 加锁 和 解锁的 代码 我们考虑这样一个场景,比如 offer 这个线程它已经获得了锁 然后它准备去获得 offer 方法中的 headLock 锁,当然现在 还没有获取,而 poll 这个线程现在已经拿到了 headLock 这把锁了,而这个 poll 线程又正准备去拿到 tailLock 锁 暂时还没有获得 那么问题就来了 ,对于 offer 线程来将 它想获取的 headLock...
9.2k 8 分钟

# 阻塞队列 - 双锁实现 1 # 回忆为什么加锁 之前在 阻塞队列 - 单锁实现中 我们使用 一把锁 保证了 队列 的线程安全,下面我们继续探讨下看看 这把锁有没有 优化的可能 我们先回忆我们会为什么要加如下这把锁在 offer 方法中呢? @Override public void offer(E e) throws InterruptedException //poll 等待队列非空 { // 加锁 (阻塞时可以随时打断) lock.lockInterruptibly(); ... [省略 代码]就是因为在 多线程 下...
11k 10 分钟

# 阻塞队列 - 单锁实现 3 - 完整实现 阻塞队列的 1 篇和 2 篇 都看完了 下面就是完整的实现代码了 先编写一个 阻塞队列接口 如下: /** 目前队列存在的问题 <ol> <li > 很多场景要求 & lt;b > 分离 & lt;/b > 生产者、消费者两个 & lt;b > 角色 & lt;/b>、它们得由不同的线程来担当,而之前的实现根本没有考虑线程安全问题 & lt;/li> <li > 队列为空,那么在之前的实现里会返回...
1.9k 2 分钟

# 阻塞队列 - 单锁实现 - 阻塞线程 2 使用 ReentrantLock 和 Condition 来实现一个简单的线程安全的队列。以下是代码的详细解释 # 代码: /* 1. synchronized 关键字,功能少 2. ReentrantLock 可重入锁,功能多 */public class TestThreadUnsafe { private final String[] array = new String[10]; private int tail = 0; private int size = 0; ReentrantLock lock = new...
954 1 分钟

# 阻塞队列 - 单锁实现 - 防止交错执行 1 在 java 中要防止 代码 多线程下的 交错执行,我们就需要用到锁 在 java 中 锁 有两种选择: 一种锁的实现是 sychronized 关键字,功能较少 ReentrantLock 翻译:entrant (进入) Reentrant (重新进入) Lock (锁) ReentrantLock (可重入锁) 。JDK 提供的工具类 而不是 关键字,相对功能比较多 # 代码: public class TestThreadUnsafe{ private final String[] array = new...