- 博客(18)
- 资源 (7)
- 收藏
- 关注
原创 《java并发编程实战》第三章
不变性 满足同步需求的另一种方法是使用不可变对象。目前为止遇到的多线程并发问题,例如失效数据,丢失更新或者某一对象的状态不一致,这些问题的根源在于操作对象状态的可变性。如果某一个对象在被创建后其状态不能被修改,那么这个对象就被称为不可变对象。记住,不可变对象一定是线程安全的。不可变对象的设计很简单,他们只有一种状态,并且该状态是由构造函数来控制的。 Final域 在...
2018-07-16 09:36:02 293
原创 java线程封闭 ThreadLocal的使用
当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式就是不共享数据。Java提供了ThreadLocal类来方便开发者们实现线程封闭,在这个ThreadLocal类中的某个值与保存值的对象关联起来。ThreadlLocal提供了get与set方法,这些方法为每一个使用该变量的线程都存着一份独立的副本,因此get总是返回当前执行线程再调用set时设置的最新值。 pack...
2018-07-16 09:33:12 265
原创 解决多线程中内存可见性的方式
上一篇博客已经讲到了内存可见性问题,内存可见性所表现出来的问题就是失效数据,而有效规避这种问题的方法就是同步。本篇博客将告诉你具体采用哪些同步方式可以解决这类问题:加锁,volatile变量。1、 加锁与可见性 内置锁可以确保某个线程以一种可预测的方式来查看另一个进程的执行结果。看下面这张图,当线程A执行某个同步代码块时,线程B随后进入由同一个锁保护的同步代码块,在这种情况下可以保...
2018-07-16 09:27:43 1435 1
原创 《java并发编程实战》_对象的共享&可见性
要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理(这句话总结的很好)。我们知道同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键字synchronized只能用于实现原子性或者确定“临界区”。同时...
2018-07-16 09:23:19 248
原创 ubuntu下使用apt-get install安装的软件的相关位置
有时候需要配置ubuntu安装的软件,一般安装软件都是使用apt-get install。那么安装完后,软件的安装目录在哪里呢,可执行文件又放在哪里呢。 A、下载的软件的存放位置:/var/cache/apt/archives B、安装后软件的默认位置:/usr/share C、可执行文件位置:/usr/bin D、配置文件位置:/etc E、lib文件位置:...
2018-07-14 15:10:15 31115 2
原创 StringUtils工具类中的小细节,final的应用
看一下下面两份代码:public class StringUtil {//代码1 private StringUtil() { // 工具类不需要实现 } public static boolean isEmpty(final String str) { return (str == null || str.length(...
2018-07-12 16:50:46 800
原创 ubuntu下redis做压测
首先,需要确定redis服务已经开启了,不确定是否开启的可以运行以下命令查看:ps -ef | grep redis一旦看到redis运行的进程,即说明redis服务已经开启了之后运行以下命令对redis做压测:redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000上面这句命令的意思是,100个并发连接,100000个请求最后将输出redis的压...
2018-07-12 11:11:24 172
原创 ubuntu 安装ssh服务
今天在windows下用vmware安装了一台ubuntu 的虚拟机,再确认ubuntu和本机windows可以相互ping通的情况下,居然不能再windos上通过xshell使用ssh命令登陆到这台虚拟机上。后来看到网上说的,可能是新装的虚拟机没有安装ssh服务,怎么确定没有安装ssh服务呢,你可以运行一下命令:service sshd start 当出现一下结果时,及说明你的虚拟...
2018-07-10 09:42:44 5526
原创 重入 锁
当某个线程请求由其他线程所持有的锁时,发出请求的线程会被阻塞,然而,由于内置锁是可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入“意味着获取锁的粒度是”线程“,而不是”调用“。重入的一种实现方法是,为每一个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程持有,当线程请求一个未被持有的锁时,jvm将记下锁的持有者,并...
2018-07-09 09:28:34 167
原创 内置锁
java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block),同步代码块包括了两部分:一个作为锁的对象引用,一个作为由这个锁所保护的代码块。以关键字syschronzied来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。静态的synchronzied方法以Class对象作为锁。 每个Java对象都可以用作一...
2018-07-09 09:27:02 1024
原创 复合操作
在前两节的程序中都需要包含一组原子方式执行(或者说不可分割)的操作,要避免竟态条件问题,就必须在某个线程修改该变量时,通过某种方式防止其他线程使用这个变量。从而确保其他线程只能在修改操作执行之前或者完成之后读取和修改状态,而不是在修改过程中。 如果递增操作是原子操作,那么竟态条件将不会发生,且递增操作在每次执行时都会把计数器增加1。为了确保线程安全性,“先检查后执行”(例如延迟初始...
2018-07-09 09:24:11 1232
原创 竟态条件
上一节讲了竟态条件,竟态条件使得最后的结果不准确,当计算的正确性取决于多个线程的交替执行时序时,那么就会发生竟态条件。换句话说,就是正确的结果取决于运气。最常见的竟态条件类型就是“先检查后执行(Check-Then-Act)”操作,即通过一个可能失效的观测结果来决定下一步的动作。 使用“先检查后执行”的一种常见情况就是延迟初始化,延迟初始化的目的是将对象的初始化操作推迟到实际被使用...
2018-07-09 09:14:08 1015
原创 原子性 多线程
当我们在无状态对象中增加一个状态时,会出现什么情况,假设我们希望增加一个请求数量的统计,一种常见的方式就是在对象中增加一个long类型的域,并且没处理一个请求就将这个值加一。package com.zy.test;public class StatelessDemo { private long count = 0; public void serv...
2018-07-09 09:10:59 466
原创 《java并发编程实战》——无状态的对象是线程安全的
在平时的项目中,每个模块都会创建多个线程,并在这些线程中调用你编写的代码,因此你需要保证你的代码是线程安全的,通常,线程安全性的需求并非来源于对线程的直接使用。例如以下方法:public class StatelessDemo { public void service() { int n = 0; int m = 1; S...
2018-07-08 11:53:08 402
原创 《java并发编程实战》——线程安全性
要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问。从非正式的意义上说(为啥这么讲我也不知道,可能这么说读者更容易理解),对象的状态是指存储在状态变量(例如实例或者静态域)中的数据。对象的状态可能包括其他依赖对象的域(意思是对象中嵌套使用了其他对象,例如HashMap中有Map.Entry一样)。 “共享”意味...
2018-07-08 11:36:15 171
原创 docker容器内部执行apt-get install vim报:unable to locate package vim
场景描述,刚从docker hub上拉取镜象ubuntu(运行命令:docker run -it ubuntu)。进入容器后,执行apt-get install vim。却报出unable to locate package vim。原因是,你第一次进容器还未执行apt-get update...
2018-07-03 09:57:01 2775
原创 docker(2)——docker的安装与运行以及下载加速
首先,我们要搭建自己的实验环境,环境选择:容器需要管理工具、runtime和操作系统。我们的选择如下: (1)管理工具:docker engine(目前最流行使用) (2)runtime-runc(docker默认的runtime) (3)操作系统——ubuntu(自己用vmware装个虚拟机)安装流程如下:配置Docker的apt源1、安装包,允许apt命令https访问doc...
2018-07-03 08:10:05 441
原创 docker(1)——容器生态系统
首先得对容器有个整体的认识,之后我们学习才能够更有针对性。一谈到容器就会想到docker,docker几乎成了容器的代名词了。 好了,言归正传,容器生态系统包括了核心技术、平台技术和支持技术。(1)容器核心技术 是指能够让container在host上运行起来的那些技术。这些技术包括了容器规范、容器runtime,容器管理工具、容器定义工具、registry以及容器OS。下面开...
2018-07-02 22:45:13 764 1
《Spring Boot实战》源代码
2018-05-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人