<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_58849698的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_58849698</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_58849698]]></copyright><item><title><![CDATA[kafka 分布式（不是单机）的情况下，如何保证消息的顺序消费?]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/121174471</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/121174471</guid><author>qq_58849698</author><pubDate>Sat, 06 Nov 2021 09:19:40 +0800</pubDate><description><![CDATA[Kafka 分布式的单位是 partition，同一个 partition 用一个 write ahead log 组织，
所以可以保证 FIFO 的顺序。不同 partition 之间不能保证顺序。但是绝大多数用
户都可以通过 message key 来定义，因为同一个 key 的 message 可以保证只发
送到同一个 partition。
Kafka 中发送 1 条消息的时候，可以指定(topic, partition, key) 3 个参数。
partiton 和 key 是可选的。如果你指定了.]]></description><category></category></item><item><title><![CDATA[a = a + b 与 a += b 的区别]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/121147005</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/121147005</guid><author>qq_58849698</author><pubDate>Thu, 04 Nov 2021 17:19:46 +0800</pubDate><description><![CDATA[a = a + b 与 a += b 的区别
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相
加，如 byte、short 或者 int，首先会将它们提升到 int 类型，然后在执行加法
操作。如果加法操作的结果比 a 的最大值要大，则 a+b 会出现编译错误，但是
a += b 没问题，如下：
byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
b += a; // o]]></description><category></category></item><item><title><![CDATA[Java 中，throw 和 throws 有什么区别]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/121113474</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/121113474</guid><author>qq_58849698</author><pubDate>Wed, 03 Nov 2021 08:22:34 +0800</pubDate><description><![CDATA[Java 中，throw 和 throws 有什么区别
throw 用于抛出 java.lang.Throwable 类的一个实例化对象，意思是说你可以通
过关键字 throw 抛出一个 Error 或者 一个 Exception，如：
throw new IllegalArgumentException(“size must be multiple of 2″)
而 throws 的作用是作为方法声明和签名的一部分，方法被抛出相应的异常以便
调用者能处理。Java 中，任何未处理的受检查异常强制在 thr]]></description><category></category></item><item><title><![CDATA[水果口味 jQuery]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/121094021</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/121094021</guid><author>qq_58849698</author><pubDate>Tue, 02 Nov 2021 09:37:02 +0800</pubDate><description><![CDATA[&lt;!DOCTYPEhtml&gt;

&lt;htmllang="en"&gt;

&lt;head&gt;

&lt;metacharset="UTF-8"&gt;

&lt;metahttp-equiv="X-UA-Compatible"content="IE=edge"&gt;

&lt;metaname="viewport"content="width=device-width,initial-scale=1.0"&gt;

&lt;title&...]]></description><category></category></item><item><title><![CDATA[构造器注入和 setter 依赖注入]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/121046483</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/121046483</guid><author>qq_58849698</author><pubDate>Sat, 30 Oct 2021 09:10:20 +0800</pubDate><description><![CDATA[构造器注入和 setter 依赖注入，那种方式更好？
每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化，但是
setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖，
Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入，可选依赖使
用 setter 注入。
112、依赖注入和工程模式之间有什么不同？
虽然两种模式都是将对象的创建从应用的逻辑中分离，但是依赖注入比工程模式
更清晰。通过依赖注入，你的类就是 POJO，它只知道依赖而不关心它们怎么获
取。使用]]></description><category></category></item><item><title><![CDATA[JRE、JDK、JVM 及 JIT 之间有什么不同？]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120990956</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120990956</guid><author>qq_58849698</author><pubDate>Wed, 27 Oct 2021 13:22:13 +0800</pubDate><description><![CDATA[JRE、JDK、JVM 及 JIT 之间有什么不同？
JRE 代表 Java 运行时（Java run-time），是运行 Java 引用所必须的。JDK 代
表 Java 开发工具（Java development kit），是 Java 程序的开发工具，如 Java
编译器，它也包含 JRE。JVM 代表 Java 虚拟机（Java virtual machine），它
的责任是运行 Java 应用。JIT 代表即时编译（Just In Time compilation），当
代码执行的次数超过一定的阈]]></description><category></category></item><item><title><![CDATA[volatile 关键字的作用]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120972553</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120972553</guid><author>qq_58849698</author><pubDate>Tue, 26 Oct 2021 15:09:05 +0800</pubDate><description><![CDATA[volatile 关键字的作用
对于可见性，Java 提供了 volatile 关键字来保证可见性。
当一个共享变量被 volatile 修饰时，它会保证修改的值会立即被更新到主存，当
有其他线程需要读取时，它会去内存中读取新值。
从实践角度而言，volatile 的一个重要作用就是和 CAS 结合，保证了原子性，详
细的可以参见 java.util.concurrent.atomic 包下的类，比如 AtomicInteger
...]]></description><category></category></item><item><title><![CDATA[如何确保线程安全？]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120950217</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120950217</guid><author>qq_58849698</author><pubDate>Mon, 25 Oct 2021 13:12:05 +0800</pubDate><description><![CDATA[如何确保线程安全？
在 Java 中可以有很多方法来保证线程安全——同步，使用原子类(atomic
concurrent classes)，实现并发锁，使用 volatile 关键字，使用不变类和线程安
全类。
73、同步方法和同步块，哪个是更好的选择？
同步块是更好的选择，因为它不会锁住整个对象（当然你也可以让它锁住整个对
象）。同步方法会锁住整个对象，哪怕这个类中有多个不相关联的同步块，这通
常会导致他们停止执行并需要等待获得这个对象上的锁。
同步块更要符合开放调用的原则，只在需要锁住的代码块锁住相应的]]></description><category></category></item><item><title><![CDATA[什么是 Daemon 线程]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120929780</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120929780</guid><author>qq_58849698</author><pubDate>Sun, 24 Oct 2021 09:13:06 +0800</pubDate><description><![CDATA[什么是 Daemon 线程？它有什么意义？
所谓后台(daemon)线程，是指在程序运行的时候在后台提供一种通用服务的线
程，并且这个线程并不属于程序中不可或缺的部分。因此，当所有的非后台线程
结束时，程序也就终止了，同时会杀死进程中的所有后台线程。反过来说，
只要有任何非后台线程还在运行，程序就不会终止。必须在线程启动之前调用
setDaemon()方法，才能把它设置为后台线程。注意：后台进程在不执行 finally
子句的情况下就会终止其 run()方法。
比如：JVM 的垃圾回收线程就是 Daemon]]></description><category></category></item><item><title><![CDATA[什么是不可变对象]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120898431</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120898431</guid><author>qq_58849698</author><pubDate>Fri, 22 Oct 2021 08:02:49 +0800</pubDate><description><![CDATA[什么是不可变对象，它对写并发应用有什么帮助？
不可变对象(Immutable Objects)即对象一旦被创建它的状态（对象的数据，也即
对象属性值）就不能改变，反之即为可变对象(Mutable Objects)。
不可变对象的类即为不可变类(Immutable Class)。Java 平台类库中包含许多不可
变类，如 String、基本类型的包装类、BigInteger 和 BigDecimal 等。
不可变对象天生是线程安全的。它们的常量（域）是在构造函数中创建的。既然
它们的状态无法修改，这些常量永远]]></description><category></category></item><item><title><![CDATA[什么是锁？]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120878812</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120878812</guid><author>qq_58849698</author><pubDate>Thu, 21 Oct 2021 07:51:50 +0800</pubDate><description><![CDATA[什么是锁？
答：数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时，在数
据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可
能会读取和存储不正确的数据，破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进
行操作前，先向系统发出请求，对其加锁。加锁后事务就对该数据对象有了一定
的控制，在该事务释放锁之前，其他的事务不能对此数据对象进行更新操作。
基本锁类型：锁包括行级锁和表级锁
...]]></description><category></category></item><item><title><![CDATA[Redis 分布式锁]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120858525</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120858525</guid><author>qq_58849698</author><pubDate>Wed, 20 Oct 2021 08:05:45 +0800</pubDate><description><![CDATA[使用过 Redis 分布式锁么，它是什么回事？
先拿 setnx 来争抢锁，抢到之后，再用 expire 给锁加一个过期时间防止锁忘记了
释放。
这时候对方会告诉你说你回答得不错，然后接着问如果在 setnx 之后执行 expire
之前进程意外 crash 或者要重启维护了，那会怎么样？
这时候你要给予惊讶的反馈：唉，是喔，这个锁就永远得不到释放了。紧接着你
需要抓一抓自己得脑袋，故作思考片刻，好像接下来的结果是你主动思考出来的，
然后回答：我记得 set 指令有非常复杂的参数，这个应该是可以同时把 se]]></description><category></category></item><item><title><![CDATA[Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行，它们有什么区别?]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120838769</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120838769</guid><author>qq_58849698</author><pubDate>Tue, 19 Oct 2021 08:19:50 +0800</pubDate><description><![CDATA[Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行，它们有什么区别?

答： sleep()方法（休眠）是线程类（Thread）的静态方法，调用此方法会让当前线程 暂停执行指定的时间，将执行机会（CPU）让给其他线程，但是对象的锁依然保 持，因此休眠时间结束后会自动恢复（线程回到就绪状态，请参考第 66 题中的线 程状态转换图）。

wait()是 Object 类的方法，调用对象的 wait()方法导致当前线 程放弃对象的锁（线程暂停执行），进入对象的等待池（wait ]]></description><category></category></item><item><title><![CDATA[抽象工厂模式和原型模式之间的区别？]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120810371</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120810371</guid><author>qq_58849698</author><pubDate>Sun, 17 Oct 2021 14:04:00 +0800</pubDate><description><![CDATA[抽象工厂模式：通常由工厂方法模式来实现。但一个工厂中往往含有多个工厂方 法生成一系列的产品。这个模式强调的是客户代码一次保证只使用一个系列的产 品。当要切换为另一个系列的产品，换一个工厂类即可。 原型模式：工厂方法的最大缺点就是，对应一个继承体系的产品类，要有一个同 样复杂的工厂类的继承体系。我们可以把工厂类中的工厂方法放到产品类自身之 中吗？如果这样的话，就可以将两个继承体系为一个。这也就是原型模式的思想， 原型模式中的工厂方法为 clone，它会返回一个拷贝（可以是浅拷贝，也可以是深 拷贝，由设计者..]]></description><category></category></item><item><title><![CDATA[Dubbo]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120781013</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120781013</guid><author>qq_58849698</author><pubDate>Fri, 15 Oct 2021 12:22:31 +0800</pubDate><description><![CDATA[Dubbo 服务降级，失败重试怎么做？

可以通过 dubbo:reference 中设置 mock="return null"。mock 的值也可以修 改为 true，然后再跟接口同一个路径下实现一个 Mock 类，命名规则是 “接口 名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑

16、Dubbo 使用过程中都遇到了些什么问题？

在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解 无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确
]]></description><category></category></item><item><title><![CDATA[如何使用 thread dump？如何分析 Thread dump？]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120757663</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120757663</guid><author>qq_58849698</author><pubDate>Thu, 14 Oct 2021 09:43:06 +0800</pubDate><description><![CDATA[、你将如何使用 thread dump？你将如何分析 Thread dump？

新建状态（New） 用 new 语句创建的线程处于新建状态，此时它和其他 Java 对象一样，仅仅在堆区 中被分配了内存。

就绪状态（Runnable）当一个线程对象创建后，其他线程调用它的 start()方法，该线程就进入就绪状态， Java 虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运 行池中，等待获得 CPU 的使用权。 运行状态（Running） 处于这个状态的线程占用 CPU，执行程序代码。只]]></description><category></category></item><item><title><![CDATA[多线程、并发及线程的基础问题]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120737983</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120737983</guid><author>qq_58849698</author><pubDate>Wed, 13 Oct 2021 09:55:39 +0800</pubDate><description><![CDATA[1、Java 中能创建 volatile 数组吗？

能，Java 中可以创建 volatile 类型数组，不过只是一个指向数组的引用，而不 是整个数组。我的意思是，如果改变引用指向的数组，将会受到 volatile 的保护， 但是如果多个线程同时改变数组的元素，volatile 标示符就不能起到之前的保护 作用了。

2、volatile 能使得一个非原子操作变成原子操作吗？

一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量 会被多个线程访问，如计数器、价格等，你最好是将..]]></description><category></category></item><item><title><![CDATA[MyBatis]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120721274</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120721274</guid><author>qq_58849698</author><pubDate>Tue, 12 Oct 2021 12:49:37 +0800</pubDate><description><![CDATA[MyBatis 面试题

1、什么是 Mybatis？

1、Mybatis 是一个半 ORM（对象关系映射）框架，它内部封装了 JDBC，开发时 只需要关注 SQL 语句本身，不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql，可以严格控制 sql 执行性 能，灵活度高。

2、MyBatis 可以使用 XML 或注解来配置和映射原生信息，将 POJO 映射成数 据库中的记录，避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

3、通]]></description><category></category></item><item><title><![CDATA[服务器概述]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120697656</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120697656</guid><author>qq_58849698</author><pubDate>Mon, 11 Oct 2021 10:08:04 +0800</pubDate><description><![CDATA[目前常见的web服务器
1，Apache(http://httpd.apache.org)

它是世界上用的最多的web服务器，市场占有率达60%左右，模块非常丰富，系统非常稳定，可移植性好，
但是比较消耗资源
2，lighttpd(http://www.lighttpd.net)

它是德国人开发的一个开源软件，目标是提供一个高性能的网站，它具有内存开销低，cpu占用低，
效能好及模块丰富，Nginx的重要竞争对手之一
3，tomcat(http://tomcat.apache.org)
...]]></description><category></category></item><item><title><![CDATA[maven]]></title><link>https://blog.youkuaiyun.com/qq_58849698/article/details/120685371</link><guid>https://blog.youkuaiyun.com/qq_58849698/article/details/120685371</guid><author>qq_58849698</author><pubDate>Sun, 10 Oct 2021 13:36:18 +0800</pubDate><description><![CDATA[建立
maven_parent父项目
项目的packaging：
pom
Packaging为
pom
的项目，不用来开发java代码。用来声明整个系统中的所需要依赖的资源。

方便项目中依赖的统一管理。
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/.]]></description><category></category></item></channel></rss>