竞态条件 & 临界区 (race condition & critical section)当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。 在临界区中使用适当的同步就可以避免竞态条件。多线程同时执行下面的代码可能会出错123456public class Counter { protected long count = 0; public void add(long value){ this.count = this.count + value; }...
非阻塞算法 vs 阻塞算法阻塞算法会阻塞线程直到请求操作可以被执行。非阻塞算法会通知请求线程操作不能够被执行,并返回。
使用非阻塞算法的好处非阻塞算法和阻塞算法相比有几个好处。下面让我们分别看一下:
1)选择
非阻塞算法的第一个好处是,给了线程一个选择当它们请求的动作不能够被执行时做些什么。不再是被阻塞在那,请求线程关于做什么有了一个选择。有时候,一个线程什么也不能做。在这种情况下,它可以选择阻塞或自我等待,像这样把CPU的使用权让给其它的任务。不过至少给了请求线程一个选择的机会。
在一个单个的CPU系统可能会挂起一个不能执行请求动作的线程,这样可以让其它线程获得CPU的使用权。不过即使...
饥饿和公平如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”。而该线程被“饥饿致死”正是因为它得不到CPU运行时间的机会。解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。
Java中导致饥饿的原因:
高优先级线程吞噬所有的低优先级线程的CPU时间。
线程被永久堵塞在一个等待进入同步块的状态。
线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法)。
首先来看一段简单的同步态代码:12345public class Synchronizer{ public synchronized ...
Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。
BlockingQueueBlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:四组不同的行为方式解释:
抛异常:如果试图的操作无法立即执行,抛一个异常。
特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能...
线程基本使用一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。
当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。
运行调用start()方法。start()方法将线程提供给JVM调度。run方法只是一个普通方法。
线程常用方法
thread.join()在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。
thread.interupt()线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新...
并行工作者模型
在并行工作者模型中,委派者(Delegator)将传入的作业分配给不同的工作者。每个工作者完成整个任务。工作者们并行运作在不同的线程上,甚至可能在不同的CPU上。
如果在某个汽车厂里实现了并行工作者模型,每台车都会由一个工人来生产。工人们将拿到汽车的生产规格,并且从头到尾负责所有工作。
在Java应用系统中,并行工作者模型是最常见的并发模型(即使正在转变)。java.util.concurrent包中的许多并发实用工具都是设计用于这个模型的。你也可以在Java企业级(J2EE)应用服务器的设计中看到这个模型的踪迹。
并行工作者模式的优点它很容易理解。你只需添加更多的工作者...
此为Java基础系列大纲。之后的文章将按照下面的大纲一一讲解
多线程-并发模型
多线程-java.lang.Thread
多线程-java.util.Concurrent
多线程-Lock
多线程-非阻塞算法
多线程-容易出现的问题
JVM-内存模型JMM
JVM-happens-before规则
JVM-类加载机制
JVM-GC垃圾回收机制
IO-文件系统
IO-java.io
IO-java.nio
IO vs. NIO
资料性内容,请善用Ctrl+F
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913...
资料性内容,请善用Ctrl+F
针对key的操作1.1 del key [key .. ] , 删除指定的一个或者多个key;1.2 dump key , 序列化给定的key1.3 restore key ttl serialized-value , 反序列化到key1.4 exists key , 判断某一key是否存在1.5 expire key seconds , 设置key的过期时间 ① set命令可以覆盖过期时间;...
更多Redis入门系列文章,参见Redis入门-大纲
搭建集群至少需要3主3从6台服务器或进程,否则你会遇到这错误
1)将redis安装目录下的redis.conf文件复制六份,分别取名为:cluster-6379.conf、cluster-6380.conf、cluster-6381.conf、cluster-6382.conf、cluster-6383.conf、cluster-6384.conf。对于一个高可用的集群方案,集群每个节点都将为其分配一个从节点,以防止数据节点因为故障下线,这里使用六份配置文件定义六个redis实例,其中三个作为主节点,剩余三个分别作为其从节点。对于这六...