beyondwild
愿你眸有星辰,心有山河,以梦为马,不负韶华!
展开
-
并发编程处理实战篇16:事务传播性说明
7种事务的传播特性 Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,如果当前线程中已经存在事务, 方法调用会加入此事务, 如果当前没有事务,就新建一个事务,(默认事务传播性是REQUIRED) Propagation.REQUIRES_NEW 无论何时自身都会开启事务,这个事务不依赖于外部事务,它拥有自己的隔离范围,自己的锁,等等。当内部事务开始执行时,外部事务将被挂起,内部事务结束时,外部事务将继续执行。 Propagation.SUPP...原创 2020-08-13 08:14:16 · 240 阅读 · 0 评论 -
并发编程处理实战篇15:BIO和NIO详解
到底什么是“IO Block” 很多人说BIO不好,会“block”,但到底什么是IO的Block呢?考虑下面两种情况: 用系统调用read从socket里读取一段数据 用系统调用read从一个磁盘文件读取一段数据到内存 如果你的直觉告诉你,这两种都算“Block”,那么很遗憾,你的理解与Linux不同。Linux认为: 对于第一种情况,算作block,因为Linux无法知道网络上对方是否会发数据。如果没数据发过来,对于调用read的程序来说,就只能“等”。 对于第二种情况,不算做bl原创 2020-08-13 08:14:09 · 185 阅读 · 0 评论 -
并发编程处理实战篇14:手机号码归属地查询接口(精确到地市)
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=手机号码原创 2020-08-13 08:13:59 · 312 阅读 · 0 评论 -
并发编程处理实战篇13:volatile和synchronized的区别与联系
这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。 int i1; int geti1() { return i1; } volatile int i2; int geti2() { return i2; } int i3;原创 2020-08-13 08:14:45 · 147 阅读 · 0 评论 -
并发编程处理实战篇12: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.hashCode()); int hash=(int)(value ^ (value原创 2020-08-13 08:14:36 · 458 阅读 · 0 评论 -
并发编程处理实战篇11:关于程序性能优化的方向
程序性能调优 ------------------------------------------------------------ 1、性能调优层次 a.设计调优; b.代码调优; c.jvm调优(如:java); d.数据库调优; e.操作系统调优;2、常用优化组件和方法 a.缓冲; b.缓存; c.对象复用-"池"; d.并行替代串行; e.负载均衡; f.时间换空间,空间换时间(如:cpu,磁盘等处理转换); ...原创 2020-08-13 08:13:46 · 126 阅读 · 0 评论 -
并发编程处理实战篇10:线程组使用
线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程对象,组中可以有线程,这样线程组可以类似树形。 线程组的使用主要是方便线程的管理维护操作: 示例 (通过线程组的方式组织多个线程并且批量停止所有线程): 1、创建线程A和B public class ThreadA extends Thread { // 设置新的构造函数,传入线程组对象 public ThreadA(ThreadGroup group, String name) { super..原创 2020-08-12 08:22:40 · 163 阅读 · 0 评论 -
并发编程处理实战篇9:线程本地变量ThreadLocal
PS: 关于多线程共享变量ThreadLocal<T> 变量值的共享可以使用public static 变量的形式,所有的线程都可以使用同一个public static变量。如果想实现每一个线程都有自己的共享变量,如何实现? JDK中提供了类ThreadLocal<T>可以解决这样的问题。原理: ThreadLocal所属包java.lang.ThreadLocal<T> 是个泛型class ThreadLocal为解决多线程并发问题提供了新的思路,使用这个类库可以原创 2020-08-12 08:22:32 · 186 阅读 · 0 评论 -
并发编程处理实战篇8:线程方法join()和sleep()区别
描述: 方法join()的作用是使所属的线程对象x正常执行run()方法,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行当前现在z后面的代码。 join还有join(long)方法,即:long为设置等待的时间, 1、join()与synchronized join()方法具有使线程排队运行的作用,有些类似synchronized, 与synchronized的区别是:查看源码可以看到join方法在内部使用了wait()方法进行等待,而synchronized使用的是对象监视器原.原创 2020-08-12 08:22:24 · 270 阅读 · 0 评论 -
并发编程处理实战篇7:java线程停止interrupt
说明: 线程在运行过程中可能需要根据条件判断进行停止,从api上开是可以使用stop方法强制终止线程,但是官方不推荐这个方法,这个是作废过期的方法,因为如果强制让线程停止则有可能使一些清理性的工作得不到完成,同时对锁定的对象进行了“解锁”,有可能导致数据得不到同步处理,从而数据出现问题。 在java中其实可以使用多种方式去终止,比如: 1、使用退出标志,使线程正常退出,也就是说设置个变量,当满足变量的时候就完成,也就是相当于run方法完成后线程终止; 2、使用interrupt方法中断线程; .原创 2020-08-12 08:22:15 · 142 阅读 · 0 评论 -
并发编程处理实战篇6:多线程交替执行
场景: 由于业务需要多线程并发操作,并且多线程之间是有一定的依赖关系,比如A线程存储数据,B线程则解析数据,即B线程是需要在A 线程执行完之后才开始执行,同样A线程存储数据的也需要B线程对数据解析完成后才开始存储新的数据,因此A与B两个线程就形成了交替实现,当然具体情况比这个复杂一些,但是大致逻辑类似。 过程就是:A=>B=>A=>B=>....如此循环... 其实该动作和队列类似,即生产者和消费者,队列长度确定,每生产一个就消费一个,确保消费完成后才生产,不过这次实现没.原创 2020-08-12 08:22:07 · 338 阅读 · 0 评论 -
并发编程处理实战篇5:线程操作wait和notify
线程进入运行状态之后,可以根据条件触发转为“等待阻塞”: 运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒, 如下代码: 1、定义两个测试线程类 public class WaitTest1 extends Thread { private Object look; public WaitTest1(Object look) { .原创 2020-08-12 08:21:59 · 171 阅读 · 0 评论 -
并发编程处理实战篇4:线程状态转换说明
线程在一定条件下,状态会发生变化, 线程一共有以下几种状态: 1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线原创 2020-08-12 08:21:49 · 146 阅读 · 0 评论 -
并发编程处理实战篇3:volatile关键字解析
一.深入剖析volatile关键字 1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 先看一段代码,假如线程1先执行,线程2后执行: //线程1 boolean stop = false; while(!stop){ doSomethin.原创 2020-08-12 08:21:37 · 172 阅读 · 0 评论 -
并发编程处理实战篇2:计算机内存模型概念
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。 也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高原创 2020-08-12 08:21:27 · 131 阅读 · 0 评论 -
并发编程处理实战篇1:目录
并发编程处理实战篇1:目录 并发编程处理实战篇2:计算机内存模型概念 并发编程处理实战篇3:volatile关键字解析 并发编程处理实战篇4:线程状态转换说明 并发编程处理实战篇5:线程操作wait和notify 并发编程处理实战篇6:多线程交替执行 并发编程处理实战篇7:java线程停止interrupt 并发编程处理实战篇8:线程方法join()和sleep()区别 并发编程处理实战篇9:线程本地变量ThreadLocal 并发编程处理实战篇10:线程组使用 并发编程处理实战篇11:原创 2020-08-12 08:21:18 · 145 阅读 · 0 评论