目录

 昨日总结

今日计划

算法——反转字符串里的单词

算法—— 反转字符串||

JVM学习笔记

JVM

JVM与字节码文件的关系

JVM、JRE、JDK三者关系图

JVM整体结构

分布式锁

分布式锁的实现

基于Redis的分布式锁实现思路:

特性:

Redisson


 昨日总结

  • 分布式锁,JVM,完成点评分布式锁
  • cv(停滞中)
  • 背诵小林coding--Java并发面试篇(1/2)
  • 代码随想录——反转字符串里的单词,反转字符串||

今日计划

  • JVM课程学习,跟进点评
  • cv(停滞中)
  • 背诵小林coding--Java并发面试篇(2/3)
  • 代码随想录——KMP算法,重复的子字符串

算法——反转字符串里的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
class Solution {
    public String reverseWords(String s) {
        StringBuilder res = new StringBuilder();
        int start = 0 ;
        // 去除前面的空格
        while(s.charAt(start)==' ') start++;
        int len = s.length();
        // 从后往前遍历字符串 定义i,j j记录单词末尾 i为单词起始
        for(int i=len-1 ; i>=start ; i--){
            // 当遍历字符是空格时i,j 同步向前移动,j保存第一个不为空格的字符
            int j = i;
            // 当i位置不为空格时,i继续向前移动知道遇到空格
            while(i>=0 && s.charAt(i)!=' '){
                i--;
            }
            // 若i!=j 此时i代表单词首个字母前一个空格 j为单词末尾
            if(i!=j){
                res.append(s.substring(i+1,j+1)); // substring endindex 不包括j+1;
                // 第一个单词前都加空格
                if(i>start){
                    res.append(' ');
                }
            }
        }
        return res.toString();
    }
}

算法—— 反转字符串||

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"
class Solution {
    public String reverseStr(String s, int k) {
        char[] c = s.toCharArray();
        int len = c.length;
        for(int i = 0;i < len;i += k*2 ) {
            for(int j = i, m = Math.min(i + k - 1, len - 1);j < m; j++, m--){
                char temp = c[j];
                c[j] = c[m];
                c[m] = temp;
            }
        }
        return new String(c);
    }
}

JVM学习笔记

JVM

定义:Java程序的运行环境(java二进制字节码的运行环境)

优点:

一次编写,到处运行;

自动内存管理,垃圾回收功能;

即时编译,对热点代码进行优化,提高执行效率。(对于字节码文件中的热点代码字节码指令,JVM会通过JIT编译器进行解释和优化,将它们翻译成汇编和机器码,将他们存储在内存中,方便再次执行时直接从内存调用)

JVM与字节码文件的关系

JVM不关心字节码文件的来源,可接受来自其他语言的字节码文件,而非受限制于java语言,只关注于字节码文件的规范。

JVM、JRE、JDK三者关系图

JVM整体结构

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易

实现,缺点是性能下降,实现同样的功能需要更多的指令。

概览图

方法区和堆是线程共享的,Java栈和本地方法栈和程序计数器是 各个线程独一份的

详细图

分布式锁

满足分布式系统或集群模式下多进程可见并且互斥的锁。

在集群模式下,synchronized的锁失效了。在集群模式中,每个集群都有他自己的JVM,都会有自己对应的锁监视器。synchronized锁通过锁监视器在JVM内部可以实现并发安全,当有多个节点时,线程就会同时进行,进而引发线程安全问题。

为此分布式锁来解决次问题。

分布式锁的实现

基于Redis的分布式锁实现思路:

利用setnxex获取锁,并设置过期时间,保存线程标示

释放锁时先判断线程标示是否与自己一致,一致则删除锁

特性:

利用set nx满足互斥性

利用setex保证故障时锁依然能释放,避免死锁,提高安全性

利用Redis集群保证高可用和高并发特性

Redisson

Redisson是一个在Redis的基础上实现的Java驻内存数据网格。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐