
并发编程
文章平均质量分 94
并发编程
漫天雪_昆仑巅
程序人生
展开
-
CAS原理分析
CAS的英文为Compare and Swap 翻译为比较并交换。CAS加volatile关键字是实现并发包的基石。没有CAS就不会有并发包,synchronized是一种独占锁、悲观锁,java.util.concurrent中借助了CAS指令实现了一种区别于synchronized的一种乐观锁。什么是乐观锁与悲观锁?悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样当第二个线程想拿这个数据的时候,第二个线程会一直堵塞,直到第一个释放锁,他拿到转载 2021-01-04 17:06:14 · 2831 阅读 · 2 评论 -
事务传播性说明
7种事务的传播特性Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,如果当前线程中已经存在事务, 方法调用会加入此事务, 如果当前没有事务,就新建一个事务,(默认事务传播性是REQUIRED)Propagation.REQUIRES_NEW 无论何时自身都会开启事务,这个事务不依赖于外部事务,它拥有自己的隔离范围,自己的锁,等等。...原创 2020-03-10 14:22:29 · 5335 阅读 · 0 评论 -
BIO和NIO详解
到底什么是“IO Block”很多人说BIO不好,会“block”,但到底什么是IO的Block呢?考虑下面两种情况:用系统调用read从socket里读取一段数据 用系统调用read从一个磁盘文件读取一段数据到内存如果你的直觉告诉你,这两种都算“Block”,那么很遗憾,你的理解与Linux不同。Linux认为: 对于第一种情况,算作block,因为Linux无法知道网络上对方...转载 2019-03-04 14:29:39 · 37586 阅读 · 7 评论 -
手机号码归属地查询接口(精确到地市)
1、淘宝网((精确到省份)API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号码2、百度(精确到地市)API地址:http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=手机号码...原创 2018-09-27 17:39:51 · 24776 阅读 · 3 评论 -
volatile和synchronized的区别与联系
这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。int i1; int geti1() { return i1;}volatile int i2; ...原创 2013-04-10 12:15:29 · 8693 阅读 · 6 评论 -
ID取模分片
根据ID取模分片,在大数据存储的时候常用到,以下是取模代码:public static void main(String[] args) { //取模方法一 for (int i = 0; i < 10000; i++) { //取hash String key = String.valueOf(i); long value = Long.valueOf(key.h...原创 2018-02-26 18:45:37 · 1823 阅读 · 0 评论 -
关于程序性能优化的方向
程序性能调优------------------------------------------------------------1、性能调优层次a.设计调优;b.代码调优;c.jvm调优(如:java);d.数据库调优;e.操作系统调优;2、常用优化组件和方法a.缓冲;b.缓存;c.对象复用-"池";d.并行替代串行;e.负载均衡;f.时间换空间,空间换时间(如:cpu,磁盘等处理转换);原创 2017-11-06 16:41:21 · 24734 阅读 · 0 评论 -
线程组使用
线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程对象,组中可以有线程,这样线程组可以类似树形。示例(通过线程组的方式组织多个线程并且批量停止所有线程):1、创建线程A和Bpublic class ThreadA extends Thread { // 设置新的构造函数,传入线程组对象 public ThreadA(ThreadGroup group, String原创 2017-11-02 17:51:11 · 24236 阅读 · 0 评论 -
线程本地变量ThreadLocal
PS:关于多线程共享变量ThreadLocal变量值的共享可以使用public static 变量的形式,所有的线程都可以使用同一个public static变量。如果想实现每一个线程都有自己的共享变量,如何实现?JDK中提供了类ThreadLocal可以解决这样的问题。原理:ThreadLocal所属包java.lang.ThreadLocal 是个泛型classThreadLocal为解决多线原创 2017-10-31 17:47:39 · 24415 阅读 · 0 评论 -
线程方法join()和sleep()区别
描述:方法join()的作用是使所属的线程对象x正常执行run()方法,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行当前现在z后面的代码。join()方法具有使线程排队运行的作用,有些类似synchronized,与synchronized的区别是:join方法在内部使用了wait()方法进行等待,而synchronized使用的是对象监视器原理实现同步。join还有join(lon原创 2017-10-31 15:09:18 · 3553 阅读 · 0 评论 -
java线程停止interrupt
说明: 线程在运行过程中可能需要根据条件判断进行停止,从api上开是可以使用stop方法强制终止线程,但是官方不推荐这个方法,这个是作废过期的方法,因为如果强制让线程停止则有可能使一些清理性的工作得不到完成,同时对锁定的对象进行了“解锁”,有可能导致数据得不到同步处理,从而数据出现问题。在java中其实可以使用多种方式去终止,比如:1、使用退出标志,使线程正常退出,也就是说设置个变量,当满足变量的原创 2017-10-25 16:57:28 · 603 阅读 · 0 评论 -
多线程交替执行
场景: 由于业务需要多线程并发操作,并且多线程之间是有一定的依赖关系,比如A线程存储数据,B线程则解析数据,即B线程是需要在A 线程执行完之后才开始执行,同样A线程存储数据的也需要B线程对数据解析完成后才开始存储新的数据,因此A与B两个线程就形成了交替实现,当然具体情况比这个复杂一些,但是大致逻辑类似。过程就是:A=>B=>A=>B=>....如此循环... 其实该动作和队列类似,即生产者和消费者原创 2017-10-31 14:13:37 · 763 阅读 · 0 评论 -
线程操作wait和notify
线程进入运行状态之后,可以根据条件触发转为“等待阻塞”:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,如下代码:1、定义两个测试线程类public class WaitTest1 extends Thread { private Objec原创 2017-10-27 16:13:56 · 6747 阅读 · 1 评论 -
线程状态转换说明
线程在一定条件下,状态会发生变化,线程一共有以下几种状态:1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。3、运行状态(Running):就绪状态的线程获取了CPU,执行程原创 2017-10-27 16:07:24 · 2450 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
在看本章之前可以先阅读上一篇文章以便对内存有一定了解:http://blog.youkuaiyun.com/vtopqx/article/details/78364685一.深入剖析volatile关键字1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了转载 2017-10-27 14:43:41 · 708 阅读 · 0 评论 -
计算机内存模型概念
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此转载 2017-10-27 14:38:39 · 12967 阅读 · 1 评论