并发编程
文章平均质量分 65
并发编程
GodSure0914
这个作者很懒,什么都没留下…
展开
-
Java并发09-stop方法和suspend方法
stop方法会终止所有未结束的方法,包括run方法。当线程被终止时,立刻释放被它锁住的所有对象的锁这会导致对象处于不一致的状态(转账转了一半被终止)suspend方法不会破坏对象,但是对于持有锁的线程,调用suspend方法并不会释放锁,如果调用suspend方法的线程试图获得同一个锁,那么程序死锁。被挂起的线程等待被恢复,将其挂起的线程等待获得锁如果想安全地挂起(暂停)一个线程,需要引入一个变量suspendRequested,并在run方法的安全地方测试它,安全指的是同步块之外。当该线程发现原创 2021-07-15 08:36:57 · 510 阅读 · 0 评论 -
Java并发08-锁的测试与超时、读写锁
锁的测试与超时、读写锁1.锁的测试与超时2.读写锁1.锁的测试与超时线程在调用lock方法获得另一个线程所持有的锁时,会发生阻塞。应该更加谨慎地申请锁,tryLock方法视图申请一个锁,在成功获得锁之后返回true;否则立刻返回false,并且线程不会进入阻塞状态if(lock.tryLock()){…}else{}可以调用tryLock时,使用超时参数tryLock(1000,TimeUnit.MILLISECONDS)TimeUnit是一个枚举类型,可以取的值lock 方法在原创 2021-06-24 09:37:53 · 527 阅读 · 0 评论 -
Java并发07-ThreadLocal
在线程之间共享变量是存在风险的,有时可能要避免共享变量,使用ThreadLocal辅助类为各个线程提供各自的实例。例如有一个静态变量public static final SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);如果两个线程同时调用sdf.format(…)那么可能会很混乱,因为sdf使用的内部数据结构可能会被并发的访问所破坏。当然可以使用线程同步,但是开销很大;或者也可以在需要时构造一个局部SImpleDateFormat原创 2021-06-23 14:23:57 · 217 阅读 · 0 评论 -
Java并发06-volatile关键字
volatile关键字作用是为成员变量的同步访问提供了一种免锁机制,如果声明一个成员变量是volatile的,那么会通知编译器和虚拟机这个成员变量是可能其他线程并发更新的会保证从线程的共享内存加载到线程工作内存是最新的,不会从线程工作缓存中读值主要是为了安全地读取这个值volatile变量不具有原子性jvm运行时刻内存的分配:其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变原创 2021-06-08 09:42:59 · 101 阅读 · 2 评论 -
Java并发05-线程同步(万字详解建议收藏)
线程同步1.使用场景1.使用场景1.使用场景1.使用场景多个线程访问同一个资源,多个线程可能会产生不一致。为了解决此问题,需要线程同步。调用某个方法时,该资源是被一个线程独占,不能被其他线程访问。不能出现一个线程在访问一个资源的时候被另一个线程打断MyThread m = new MyThread();Thread t1 = new Thread(m);Thread t2 = new Thread(m);t1.start();t2.start();这是两个线程,如果run方法中调用了一个原创 2021-06-02 08:33:05 · 213 阅读 · 2 评论 -
Java并发04-守护线程及未捕获异常处理器~
1.守护线程可以通过调用将线程转换为守护线程守护线程的唯一用途是为其他线程提供服务。比如计时线程,它定时发送信号给其他线程当只剩下守护线程时,JVM就退出了。守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断2.未捕获异常处理器线程的run方法不能抛出任何异常。但是不被检测的异常会导致线程终止不需要任何的catch子句来处理可以被传播的异常;在线程死亡之前,异常可以被传递给一个用于未捕获异常的处理器处理器实现了Thread.UncaughtE原创 2021-05-25 09:36:53 · 323 阅读 · 0 评论 -
Java并发03-线程的优先级Priority
优先级越高,获得Cpu执行的时间片就会越多Thread.MAX_PRIORITYThread.MIN_PRIORITYThread.NORM_PRIORITY示例:public class test { public static void main(String[]args){ Thread t1 = new Thread(new Thread1()); Thread t2 = new Thread(new Thread2()); t1.setPriority(Thread.NO.原创 2021-05-21 09:02:06 · 177 阅读 · 0 评论 -
你知道分布式事务的@GlobalLock注解是干什么的吗?
写隔离流程如下:分支事务1-开始|V 获取 本地锁|V 获取 全局锁 分支事务2-开始| |V 释放 本地锁 V 获取 本地锁| |V 释放 全局锁 V 获取 全局锁|V 释放 本地锁|V 释放 全局锁如上所示,一个分布式事务的锁获取流程:1)先获取到本地锁,这样你已经可以修改本地数据了,只是还不能本地事务提交2)而后,能否提交就是看能否获得全局锁3)获得了全局锁,意味着可以修改了,那么提交本地事原创 2021-05-17 14:25:05 · 1379 阅读 · 0 评论 -
java并发02-线程的状态五千字详解,走过路过不要错过!!!
线程就是内存中的一个对象,线程并不是调用start方法之后就立刻开始执行而是表示准备好了(Cpu可能正在执行其他线程),应该进行排队。当Cpu有时间片了,就分配给这个线程开始执行,如果到时间了,那么停止运行,重新排队。重复这个过程,直至运行完毕。如果运行中出现状况,那么会停止运行,进入阻塞状态,直至解除才能进入就绪状态,准备排队。如果没有解除那么就会中止。简言之就是 创建(new Thread) 就绪(start()) 执行(run()) ( 阻塞 解除阻塞 ) 就绪执行反复循环...原创 2021-05-14 10:48:04 · 122 阅读 · 2 评论 -
多线程分段下载Http超大文件,100%成功的方法
今天早上经理丢给我个链接,一个139G的http文件,说这个文件下载有线程数和时间的限制必须使用至少十个线程下载,我首先想到的是用java代码实现,网上找了七八种“大佬”们分享的方法,其中还包含两个本站的付费包,要么不能运行要么各种报错,然后又找了几个打好的jar包,好家伙,一运行直接内存溢出,电脑卡了好一会。![在这里插入图片描述](https://img-blog.csdnimg.cn/2020080313375662.png?x-oss-process=image/watermark,type_Zm原创 2020-08-03 13:46:07 · 1363 阅读 · 0 评论