<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[liam12138的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Programmer12117</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Programmer12117]]></copyright><item><title><![CDATA[Java并发编程 同步容器类]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/113361013</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/113361013</guid><author>Programmer12117</author><pubDate>Thu, 28 Jan 2021 23:26:36 +0800</pubDate><description><![CDATA[同步容器类包括 Vector 和 Hashtable，这些同步的封装器类是由Collections.synchronizedXxx 等工厂方法创建的。这些类实现线程安全的方式是将它们的状态封装起来，并对每个公有方法都进行同步，使得每次只有一个线程能访问容器的状态。
1. 同步器类的问题
同步容器类都是线程安全的，但在某些情况下可能需要额外的客户端加锁来保护复合操作。容器上常见的复合操作包括：迭代（反复访问元素，直到遍历完容器中所有元素)、跳转(根据指定顺序找到当前元素的下一个元素〉以及条件运算，例如“若没有]]></description><category></category></item><item><title><![CDATA[Java并发编程 设计线程安全的类]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/112974437</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/112974437</guid><author>Programmer12117</author><pubDate>Thu, 21 Jan 2021 23:03:39 +0800</pubDate><description><![CDATA[在线程安全的程序中，虽然可以将程序的所有状态都保存在公有的静态域中，但与那些将状态封装起来的程序相比，这些程序的线程安全性更难以得到验证，并且在修改时也更难以始终确保其线程安全性。通过使用封装技术，可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。
在设计线程安全类的过程中，需要包含以下三个基本要素：
1. 找出构成对象状态的所有变量；
2. 找出约束状态变量的不变性条件；
3. 建立对象状态的并发访问管理策略。

要分析对象的状态，首先从对象的域开始。如果对象中所有的域都是基本类型的]]></description><category></category></item><item><title><![CDATA[Java并发编程-线程封闭]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/112912983</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/112912983</guid><author>Programmer12117</author><pubDate>Wed, 20 Jan 2021 22:49:35 +0800</pubDate><description><![CDATA[线程封闭
当访问共享的可变数据时，通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据，就不需要同步。这种技术就是线程同步，它是实现线程安全性的最简单方式之一。当某个对象封闭在一个线程中，这种用法将自动实现线程安全性，即使被封闭的对象本身不是线程安全的。
线程封闭技术的一种常见应用是 JDBC 的 Connection 对象。JDBC 规范并不要求 Connection 对象必须是线程安全的。线程从线程池中获取一个 Connection 对象，并且用该对象处理请求，使用完后再将对]]></description><category></category></item><item><title><![CDATA[java.lang.IllegalStateException 错误解决过程]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/112794799</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/112794799</guid><author>Programmer12117</author><pubDate>Mon, 18 Jan 2021 20:57:57 +0800</pubDate><description><![CDATA[java.lang.IllegalStateException 错误解决过程
今天在搭建 spring boot 项目的过程中出现了以下的错误，也是花了好长时间才解决，今天我就来分享一下我解决报错的过程。
2021-01-18 19:59:28.637 ERROR 19504 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateExcept]]></description><category></category></item><item><title><![CDATA[Java并发编程 对象的共享]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/112178783</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/112178783</guid><author>Programmer12117</author><pubDate>Mon, 04 Jan 2021 15:04:18 +0800</pubDate><description><![CDATA[Java并发编程 对象的共享
1. 可见性
可见性是一种复杂的属性。在单线程环境中，如果向某个变量先写入值，然后在没有其他写入操作的情况下读取这个变量，那么总能得到相同的值。然而，当读操作和写操作在不同的线程中执行时，情况却并非如此。通常，我们无法确保执行读操作的线程能适时地看到其他线程写入的值，有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性，必须使用同步机制。
下面代码说明了当多个线程在没有同步的情况下共享数据时出现的错误。在代码中，主线程和读线程都将访问共享变量 ready 和 ]]></description><category></category></item><item><title><![CDATA[Java并发编程 线程安全性]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/111871555</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/111871555</guid><author>Programmer12117</author><pubDate>Mon, 28 Dec 2020 17:47:21 +0800</pubDate><description><![CDATA[Java并发编程 线程安全性
“共享”意味着变量可以由多个线程同时访问，而“可变”则意味着变量的值在生命周期内可以发生变化。如何防止在数据上发生不受控的并发访问，是我们需要讨论的点。
一个对象是否需要是线程安全的，取决于它是否被多个线程访问。这指的是在程序中访问对象的方式，而不是对象要实现的功能。要使得对象是线程安全的，需要采用同步机制来协同对对象可变状态的访问。如果无法实现协同，那么可能会导致数据破坏以及其他不该出现的结果。
当多个线程访问某个状态变量并且其中有一个线程执行写入操作时，必须采用同步机制来协]]></description><category></category></item><item><title><![CDATA[分布式计算模拟]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/111474960</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/111474960</guid><author>Programmer12117</author><pubDate>Mon, 21 Dec 2020 14:57:26 +0800</pubDate><description><![CDATA[1. 概念
分布式计算是一种计算方法，和集中式计算是相对的。
随着计算技术的发展，有些应用需要非常巨大的计算能力才能完成，如果采用集中式计算，需要耗费相当长的时间来完成。
分布式计算将该应用分解成许多小的部分，分配给多台计算机进行处理。这样可以节约整体计算时间，大大提高计算效率。

2. 简单的分布式计算框架
想要实现分布式计算，首先我们至少需要两个进程，一个负责逻辑的准备和逻辑的准备，一个负责执行计算，如小图所示（我们以 JVM 进程为例）

这样的计算架构其实就和 client/server 这种架构设]]></description><category></category></item><item><title><![CDATA[Java 并发编程-显式锁]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/111172571</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/111172571</guid><author>Programmer12117</author><pubDate>Mon, 14 Dec 2020 15:29:59 +0800</pubDate><description><![CDATA[Java 并发编程-显式锁
在 Java5.0 之前，在协调对对象的访问时可以使用的机制只有 synchronized 和 volatile。
Java5.0 增加了一种新的机制：ReentrantLock，ReentrantLock 并不是一种替代的内置加锁的方法，
而是内置加锁机制不适用时，作为一种可选择的高级功能。

1. Lock 与 ReentrantLock
下面给出了 Lock 接口，Lock 接口中定义了一组抽象的加锁操作，与内置加锁机制不同的是，Lock 提供了一种无条件的、可轮询的、定时]]></description><category></category></item><item><title><![CDATA[Redis之分布式锁]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/111031750</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/111031750</guid><author>Programmer12117</author><pubDate>Fri, 11 Dec 2020 11:18:14 +0800</pubDate><description><![CDATA[Redis之分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。比如，一个操作要修改用户状态，修改状态需要先读出用户的状态，在内存里进行修改，改完再存进去。如果有多个系统同时今夕操作，就会出现并发问题，因为读取和保存状态这两个操作不是原子的。
这个时候就要使用到分布式锁来限制程序的并发执行。Redis 分布式锁就是最广泛的方案之一。
分布式锁
分布式锁本质上要实现的目标就是在 Redis 里面占有一个位置，当别的进程也要来占用时，发现已经有人占用了，就只能放弃或者稍后再试。
对于这样的操作，我们一般使用 ]]></description><category></category></item><item><title><![CDATA[Java并发编程-可利用的并行性]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/110425739</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/110425739</guid><author>Programmer12117</author><pubDate>Tue, 01 Dec 2020 11:18:10 +0800</pubDate><description><![CDATA[Java并发编程-可利用的并行性
Executor 框架帮助指定执行策略，但如果要使用 Executor，必须将任务表述为一个 Runnable。在大多数服务器应用程序中都存在一个明显的任务边界：单个客户请求。有时候，任务边界并非是显而易见的，在很多桌面应用程序中，在单个客户请求中任可能存在可发掘的并行性。本文以 HTML 页面绘制为例，进行详细说明。
1. 串行的页面渲染器
最简单的方法就是对 HTML 文档进行串行处理。当遇到文本标签时，将其绘制到图像缓存中。当遇到图像引用时，先通过网络获取它，然后再将]]></description><category></category></item><item><title><![CDATA[Java并发编程 Executor框架]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/110262188</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/110262188</guid><author>Programmer12117</author><pubDate>Sat, 28 Nov 2020 11:17:41 +0800</pubDate><description><![CDATA[Java并发编程 Executor框架
1. 在线程中执行任务
在理想情况下，各个任务之间是相互独立的：任务并不依赖于其他任务的状态、结果或者边界效应，独立性有助于实现并发，因为如果存在足够多的处理资源，那么这些独立的任务都可以并行执行。为了在调度与负载均衡等过程中实现更高的灵活性，每项任务还应该表示应用程序的一小部分处理能力。
2. 串行的执行任务
在应用程序中可以通过多种策略来调度任务，而其中一些策略能够更好地利用潜在的并发性。最简单的策略就是在单个线程中串行地执行各项任务。如下：
public cla]]></description><category></category></item><item><title><![CDATA[Redis之主从同步]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/110078193</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/110078193</guid><author>Programmer12117</author><pubDate>Tue, 24 Nov 2020 14:46:53 +0800</pubDate><description><![CDATA[Redis之主从同步
在很多时候，我们为了达到 Redis 的高可用，我们都会做主从。有了主从，当 master 挂掉的时候，运维让从库来接管，服务就可以继续，否则master 需要经过数据恢复和重启的过程，这就可能会拖很长的时间，影响线上业务的持续服务。

1. CAP 原理
分布式存储的理论基石
1. C - Consistent 一致性
2. A - Availability 可用性
3. P - Partition tolerance 分区容忍性

分布式系统的节点往往都是分布在不同的机器上进行网络]]></description><category></category></item><item><title><![CDATA[Redis 之事务]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/110008587</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/110008587</guid><author>Programmer12117</author><pubDate>Mon, 23 Nov 2020 21:40:43 +0800</pubDate><description><![CDATA[Redis 之事务
为了确保连续多个操作的原子性，一个成熟的数据库通常都会有事务支持，Redis 也同样如此。Redis 的事务使用非常简单，不同于关系数据库，我们无须理解那么多复杂的事务模 型，就可以直接使用。
1. Redis 事务的基本使用
每个事务的操作都有 begin、commit 和 rollback，begin 指示事务的开始，commit 指示 事务的提交，rollback 指示事务的回滚。
Redis 事务的形式也是差不多的，分别是 multi/exec/discard
1. multi：]]></description><category></category></item><item><title><![CDATA[安装Windows版RabbitMQ失败总结]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/109479899</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/109479899</guid><author>Programmer12117</author><pubDate>Tue, 03 Nov 2020 21:45:43 +0800</pubDate><description><![CDATA[安装Windows版RabbitMQ失败总结
这几天在学习RabbitMQ，由于实习公司要求安装Windows版本的，试了一下安装Windows版本的RabbitMQ。
经过一天的折腾可总算把RabbitMQ给安装好了。

1. 错误界面
每次输入 rabbitmqctl status 或者 rabbitmqctl 的其他指令时，都会出现类似于下面的错误


上述显示的错误主要有三个点：
1. 目标节点无法访问
2. CLI工具无法通过服务器进行身份验证（cookie不匹配）
3. 目标节点未运行

2. ]]></description><category></category></item><item><title><![CDATA[Spark中的map相关的算子以及区别]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/106251329</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/106251329</guid><author>Programmer12117</author><pubDate>Thu, 21 May 2020 13:59:30 +0800</pubDate><description><![CDATA[Spark中map相关算子及区别

map算子：map[U](f: (T) =&gt; U): RDD[U]
是对RDD中的每个元素都执行一个指定的函数开产生一个新的RDD。
示例：

val conf = new SparkConf().setAppName("WC").setMaster("local[*]")

val sc = new SparkContext(conf)

val lineRDD = sc.makeRDD(1 to 10)
      .map(data =&gt; {
     ]]></description><category></category></item><item><title><![CDATA[SpringBoot 整合cache运行出错]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/105435442</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/105435442</guid><author>Programmer12117</author><pubDate>Fri, 10 Apr 2020 15:53:15 +0800</pubDate><description><![CDATA[SpringBoot 整合cache运行出错
在我学习SpringBoot与缓存时，编写了如下代码：
 @Cacheable(cacheNames = {"emp"})
    public Employee getEmployeeById(Integer id){
        System.out.println("search "+ id +" number employee");
   ...]]></description><category></category></item><item><title><![CDATA[Hive启动报错]]></title><link>https://blog.youkuaiyun.com/Programmer12117/article/details/104858638</link><guid>https://blog.youkuaiyun.com/Programmer12117/article/details/104858638</guid><author>Programmer12117</author><pubDate>Sat, 14 Mar 2020 12:57:27 +0800</pubDate><description><![CDATA[Hive启动报错
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /tmp/hive. Name node is in safe mode.
这是因为没有没有关闭HDFS的安全模式，所...]]></description><category></category></item></channel></rss>