文章 39
评论 43
浏览 115079
随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决

随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决

前言 继上条博文 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 后,我发现控制台随后仍出现了一些乱码,并不受到在conf/logging.properties文件修改GBK后的影响,它输出的仍是UTF-8,导致控制台仍然蓝屏。 排查方向 这次的错误排查,我换了个方向,上一次是针对修改Tomcat的配置,这一次是在不变动Tomcat配置的情况下,让Windows适应其配置。 解决问题 控制台编码 了解系统的朋友可能都知道,Windows的控制台默认使用GBK编码,而类Unix系统使用的大都是UTF-8编码,这也就导致了中文乱码的发生。 那么如何将Windows的控制台修改为UTF-8编码呢? 引用 https://blog.csdn.net/qq_34273222/article/details/83508671: 在运行中通过regedit进入注册表 找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor 新建-字符串值,命名autorun,右键修改:数值数据填写 “chcp....

随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用

随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用

在阅读AtomicStampedReference的源码中,在compareAndSet()方法发现一段代码: return expectedReference == current.reference && expectedStamp == current.stamp && //上方条件全部符合且为True时,执行下方代码 ((newReference == current.reference && newStamp == current.stamp) || casPair(current, Pair.of(newReference, newStamp))); 即在return执行方法,并获取最终结果。我编写了一段代码用以测试: public class Main { public static void main(String[] args) { Main main = new Main(); System.out.println( main.executeIsTrue() ); System.out.println(); Sys....

大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

前言 第一章还没看过?点我可以穿越 阅读本篇文章,你需要了解以下知识: Atomic是什么?(点此跳转) 单向链表的原理 从上一章的内容,我们可以了解到,Atomic可以基本解决线程同步安全的问题。而本章我们将讨论Atomic的缺点与它的原子性。 ABA问题 什么是ABA问题?首先我们都知道,Atomic的CAS模型,会先读取变量的值,作为预期旧值,然后再基于旧值产生操作生成新值,再确认变量是否为预期旧值,如果是,修改为新值。 我们以单向链表来演示ABA会导致的问题: 解决ABA问题 现在我们知道了,由于Atomic仅判断了旧值,但并没有意识到整个链表已经被修改过一次了。所以我们要引入一个新的概念: 版本 Atomic在修改值时,保存的不仅再是旧值,还有一个版本号。在每次更改后,版本号都会变化,这样就不会再产生ABA问题了。我们看图: AtomicStampedReference Atomic的开发者自然也意识到了这个问题,并后续开发了AtomicStampedReference来修复这个问题。我们用一段简单的代码来实现: import java.util.concurrent....

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

前言 阅读本篇文章,你需要对下方知识有所了解: synchronized关键词的作用 线程池的作用(这里) 不靠谱和慢动作 在多线程环境下: 操作靠谱程度执行速度 i++ 自增运算没戏不赖 synchronized贼棒太废 不靠谱的自增 操作类 假如我们现在有一个变量:num 我们这个变量设置两个方法: 方法返回值作用 plus()void将num自增(+1) getNum()Integer返回num的值 代码如下: class Num { Integer num = 0; public void plus() { num++; } public Integer getNum() { return num; } } 主类 然后在另一个类主方法中新建一个缓存线程池: ExecutorService executorService = Executors.newCachedThreadPool(); 当我们执行executorService.execute(new Runnable() {})时,缓存线程池会将指定的对象以非阻塞的方式提交到队列中。 随后再写....

刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解!

刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解!

前言 阅读本篇文章,你需要理解以下的知识: 重要:反射 (参考) Java enum 接口的使用 了解注解是什么、该什么时候使用 最好接触过Spring(因为用@RequestMapping举例) 先说说注解 如果你熟悉Spring框架,你一定使用过这个注解: @RequestMapping(value = "/admin/index.html", method = RequestMethod.GET) 这条注释的意思是: 用户访问"/admin/index.html"页面,则执行下方方法 限制用户只能使用"GET"方式访问 那么Spring在启动后是如何知道你用了这个注解,并且调用这个注解指定的方法的呢? 让我们先大体猜测一下: 我们可以配置Spring扫描的@Controller所在目录 Spring扫描目录,并逐个扫描@Controller类中的注解 解析所有扫描到的注解,并通过反射,执行指定注释下的方法 实例 打开你的IDE,新建一个类Main.java,并复制下方语句: import java.lang.annotation.ElementType; impor....

大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用?

大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用?

前言 阅读本篇文章,你需要了解下列知识: 多线程的实现(看过来) Iterator的使用 ArrayList的使用和如何实现Iterator 为什么会有这个机制? 举个栗子 有一杯水、两个人(黄渤和红雷) 黄渤拿起了水杯,开始喝水 红雷到达案发现场,想抢走水杯喝水 黄渤很生气,并锤了红雷一顿 映射关系 将上面的栗子翻译一下: 有一个ArrayList、两个线程(Thread1和Thread2) Thread1请求并开始使用Iterator遍历ArrayList Thread2随后紧跟请求对ArrayList进行修改 由于Thread1正在遍历ArrayList,ArrayList对Thread2扔出ConcurrentModificationException 继承关系 Tip 如果下面的知识让你难以搞懂,可以直接跳过,在深入学习接口和继承后,再回来看一遍。 看起来有些困难?没关系。 ArrayList继承了Iterable接口,实现了基于Iterator的遍历功能。 ArrayList实现Iterator的部分源码如下: /** * An optimized ver....

大白话 | 课堂实践:使用Iterator对数组进行遍历

大白话 | 课堂实践:使用Iterator对数组进行遍历

前言 阅读本篇文章,你需要对以下知识有所了解: 接口(这儿有) Iterator的使用 Java 匿名内部类 构思 我们都知道,Iterator是一种迭代器,它的接口中有四种方法(JDK 1.8): public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action);while (hasNext()) action.accept(next()); } } 方法返回值作用 hasNext()boolean查找是否还有下一个元素,如果有,返回true,反则返回false next()Object返回下一个元素 remove()void删除当前指向的元素 forEachRe....

大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我!

大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我!

前言 作为一个正经博主,我会用最纯洁易懂的方式让你理解面向接口编程。 阅读本篇文章,你需要对以下知识有所了解: 面向对象编程基础知识 接口(这儿有) 实例 废话少说。打开你的IDE(没有?去下!),新建一个类,命名为Main,复制下方代码: interface 动作 { void 结婚(); void 生孩子(); } class 如花 implements 动作 { @Override public void 结婚() { System.out.println("为什么?"); } @Override public void 生孩子() { System.out.println("凭什么?"); } } class 美女 implements 动作 { @Override public void 结婚() { System.out.println("就现在!"); } @Override public void 生孩子() { System.out.println("就今晚!"); } } class 帅气的我 { private 动作 小姐姐; public 动作 我女朋友是谁....

大白话之Java反射-初学最迷的概念:能干啥?咋用?

大白话之Java反射-初学最迷的概念:能干啥?咋用?

前言 初学时,反射、网络编程、IO是我最不能理解的三大模块。 当时查资料,给我的感觉是:写文章的都觉得我已经会了。 如今,我用实例尽可能简单地讲述反射这个东西。 能干啥? 人类文明分为三个阶段: 女娲创造人类 人类文明建立,地球产生秩序 人类灭亡 实例化 平常我们实例化一个类,都是用: Main main = new Main(); 那如果要读取这个类中的公共变量,我们需要: public class Main { public String value = "HelloWorld!"; } public class Test { public static void main(String[] args) { Main main = new Main(); System.out.println(main.value); } } 那么我们如果将这个变量设置为私有呢? public class Main { private String value = "HelloWorld!"; } 很明显,我们无法获得该变量的值,因为变量的作用域止步于自己的类中。 那么如果我们使用反射,我....

死钻技术 | 绝不抄袭