![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 54
爱的叹息
to be or not to be ,this is a question
展开
-
java面试第1弹——线程的创建方式
本文讲一下Java线程池中创建 ThreadFactory 设置线程名称的三种方式。Java线程池中三种方式创建 ThreadFactory 设置线程名称_customizablethreadfactory_阿飞云的博客-CSDN博客。需要引入线程池构建工厂,这里引入的是google的guava的ThreadFactoryBuilder。:启动线程是调用start方法,这样会创建一个新的线程,并执行线程的任务。线程池创建方式很多,这里以ThreadPoolExecutor举例子。原创 2023-04-03 16:25:28 · 222 阅读 · 0 评论 -
java 多线程&wait条件发生变化与使用while的必要性——77
出现异常的原因是有两个实现删除remove()操作的线 程,它们在“Thread.sleep(1000);”之前都执行了wait() 方法,呈等待状态,当加操作的线程在1s之后被运行时, 通知了所有呈等待状态的减操作线程,那么第一个实现减 操作的线程能正确地删除list中索引为0的数据,但第二个 实现减操作的线程则出现索引溢出的异常,因为list中仅仅 添加了一个数据,也只能删除一个数据,没有第二个数据 可供删除,所以出现了java.lang.Index- OutOfBoundsException异常。..原创 2022-06-27 13:44:09 · 233 阅读 · 0 评论 -
java 多线程& 通知过早问题与解决方法——76
notify()过早通知wait();如果通知过早,则会打乱程序正常的运行逻辑原创 2022-06-27 07:23:22 · 177 阅读 · 0 评论 -
java 多线程& wait(long)方法自动向下运行需要重新持有锁——75
wait(long)方法想要自动向下运行也要持有锁,如果没有锁,则一直在等待,直到持有锁为止。由程序运行结果可以看出,end输出的时间是在输出begin之后的8s,并不是5s。同时wait()方法执行后释放锁,而sleep()方法执行后不释放锁...原创 2022-06-27 05:29:12 · 272 阅读 · 0 评论 -
java 多线程& wait(long)方法的基本使用——74
带一个参数的wait(long)方法的功能是等待某一时间内是否有线程对锁进行notify()通知唤醒,如果超过这个时间则线程自动唤醒,能继续向下运行的前提是再次持有锁原创 2022-06-27 05:13:35 · 407 阅读 · 2 评论 -
java 多线程& notifyAll()方法:通知所有线程——73
唤醒的顺序是正序、倒序、随机,取决于具体的JVM实现,不是所有的JVM在执行notify()时都是按调用wait()方法的正序进行唤醒的,也不是所有的JVM在执行notifyAll()时都是按调用wait()方法的倒序进行唤醒的,具 体的唤醒顺序依赖于JVM的具体实现。...原创 2022-06-26 17:23:15 · 575 阅读 · 0 评论 -
java 多线程& notify()方法:只通知一个线程——72
每调用一次notify()方法,只通知一个线程进行唤醒,唤醒的顺序与执行wait()方法的顺序一致。原创 2022-06-26 17:13:04 · 268 阅读 · 0 评论 -
java 多线程&interrupt()方法遇到wait()方法——71
1)执行完notify()方法后,按照执行wait()方法的顺序唤醒其他线程。notify()所在的同步代码块执行完才会释放对象的锁,其他线程继续执行wait()之后的代码。2)在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。3)在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,等待被唤醒。...原创 2022-06-26 17:00:55 · 409 阅读 · 1 评论 -
java 多线程& notify()方法:不立即释放锁——70
notify()方法执行后锁不释放通过对控制台输出的时间的分析,可以总结出:必须 执行完notify()方法所在的同步synchronized代码块后才释放锁。原创 2022-06-26 10:16:08 · 416 阅读 · 0 评论 -
java 多线程&sleep()方法:不释放锁——69
如果将wait()方法改成sleep()方法,就获得了同步的效果,因为sleep()方法不释放锁原创 2022-06-26 09:13:19 · 304 阅读 · 0 评论 -
java 多线程&wait()方法:立即释放锁——68
wait()方法自动将锁释放原创 2022-06-26 08:59:50 · 618 阅读 · 0 评论 -
java 多线程&线程状态的切换——67
线程状态和线程生命周期原创 2022-06-26 08:48:13 · 523 阅读 · 0 评论 -
java 多线程&对业务代码进行封装——66
前面示例是在自定义的MyThread类中处理业务,而业务代码要尽量放在Service业务类中进行处理,这样代码更加标准原创 2022-06-25 15:48:56 · 257 阅读 · 0 评论 -
java 多线程&使用wait/notify机制实现list.size()等于5时 的线程销毁——65
关键字synchronized可以将任何一个Object对象作为锁来看待,而Java为每个Object都实现了wait()和notify()方法,它们必须用在被synchronized同步的Object的临界区内。通过调用wait()方法可以使处于临界区内的线程进入等待状态,同时释放被同步对象的锁,而notify操 作可以唤醒一个因调用了wait操作而处于wait状态中的线程,使其进入就绪状态,被重新唤醒的线程会试图重新获得临界区的控制权,也就是锁,并继续执行临界区内wait之后的代码。如果发出notif.原创 2022-06-25 15:37:04 · 165 阅读 · 0 评论 -
java 多线程&完整实现wait/notify机制——64
完整实现wait/notify机制原创 2022-06-24 07:31:00 · 82 阅读 · 0 评论 -
java 多线程&wait()方法的基本使用——63
wait()方法的作用是使当前线程暂停运行,并释放锁。如何使呈wait状态的线程继续运行呢?答案就是使用notify()方法。原创 2022-06-24 06:26:52 · 384 阅读 · 0 评论 -
java 多线程&wait/notify机制的原理——62
wait()方法使线程暂停运行,而notify()方法通知暂停的线程继续运行。原创 2022-06-24 06:13:33 · 290 阅读 · 0 评论 -
java 多线程&wait/notify机制——61
在这个过程中出现了wait/notify机制原创 2022-06-24 06:05:02 · 135 阅读 · 0 评论 -
java 多线程&不使用wait/notify机制实现线程间通信——60
使用sleep()结合while(true)死循环法来实现多个线程间的通信。对变量:volatile private List list = new ArrayList();添加volatile关键字,以实现A线程和B线程间的可视性虽然两个线程间实现了通信,但缺点是线程ThreadB.java不停地通过while语句轮询机制来检测 某一个条件,这样会浪费CPU资源。如果轮询的时间间隔很小,则更浪费CPU资源;如果轮询的时间间隔很大,则有可能取不到想要的数据。wait/notify(等待/通知原创 2022-06-11 23:14:25 · 176 阅读 · 1 评论 -
java 多线程&volatile和synchronized关键字:禁止代码重排序的测试——59
关键字volatile和synchronized的使用场景关键字volatile和synchronized的作用原创 2022-06-11 07:23:38 · 148 阅读 · 0 评论 -
java 多线程&volatile关键字:原子性的测试——58
在32位系统中,针对未使用volatile声明的long或double数据类型没有实现写原子性,如果想实现,则声明变量时添加volatile。在64位系统中,原子性取决于具体的实现,在X86架构64位JDK版本中,写double或long是原子的。另外,volatile关键字最致命的缺点是不支持原子性,也就是多个线程对用volatile修饰的变量i执行i--操作时,i--操作还会被分解成3步,造成非线程安全问题的出现。...原创 2022-06-10 14:50:41 · 216 阅读 · 1 评论 -
java 多线程&volatile关键字:可见性的测试——57
关键字volatile具有可见性,可见性是指A线程更改变量的值后,B线程马上就能看到更改后的变量的值,提高了软件的灵敏度。出现这个结果是由各线程间的数据值没有可视性造成的,关键字synchronized具有增加可视性的作用...原创 2022-06-10 10:06:03 · 322 阅读 · 0 评论 -
java 多线程&volatile关键字——56
volatile在使用上具有以下特性1)可见性B线程能马上看到A线程更改的 数据。2)原子性在32位系统中,针对未使用volatile声明的long或double数据类型没有实现写原子性,如果想实现,则声明变量时添加volatile,而在64位系统中,原子性取决于具体的实现,在X86架构64位JDK版本中,写double或long是原子的。另外,针对用volatile声明的int i变量进行i++操作时是非原子的。这些知识点都在后面的章节有代码进行验证。3)禁止代码重排序...原创 2022-06-10 06:58:40 · 81 阅读 · 0 评论 -
java 多线程&同步写法案例比较——55
上面的代码中出现了3种类型的锁对象(A)testMethod1()和testMethod2()持有的锁是同一个,即MyService.java对应Class类的对象。(B)testMethod3()和testMethod4()持有的锁是同一个,即MyService.java类的对象。(C)testMethod5()持有的锁是字符串abc。说明testMethod1()和testMethod2()是同步关系,testMethod3()和testMethod4()是同步关系。A和C之间是异步关系,原创 2022-06-10 06:54:31 · 77 阅读 · 0 评论 -
java 多线程&锁对象不改变依然同步执行——54
只要对象不变就是同步效果,因为A线程和B线程持有的锁对象永远为同一个,仅仅对象的属性改变了,但对象未发生改变。原创 2022-06-09 22:05:18 · 124 阅读 · 0 评论 -
java 多线程&锁对象改变导致异步执行——53
需要注意的是,字符串String类型是不可变的,用于创建新的内存空间来存储新的字符。控制台输出的信息说明A线程和B线程检测到锁对象的值"123","123"存储到A线程内存空间中,虽然将锁改成了"456","456"存储到B线程内存空间中,但结果还是同步的,因为A线程和B线程共同争抢的锁是A线程内存空间中的"123",不是B线程内存空间中的"456"。但是,还是会有很小的机会会出现一起输出两个begin的情况,那是因为A线程将锁值改变之后,B线程才启动去执行run()方法,不存在A线程和B线程争抢锁的情原创 2022-06-09 17:14:10 · 198 阅读 · 0 评论 -
java 多线程&内置类与同步:实验2——52
本实验测试同步代码块synchronized(lock)对lock上锁后,其他线程只能以同步的方式调用lock中的同步方法。原创 2022-06-09 16:55:23 · 83 阅读 · 0 评论 -
java 多线程&内置类与同步:实验1——51
本实验测试的案例是在内置类中有两个同步方法,但使用的是不同的锁,输出结果也是异步的。原创 2022-06-09 16:43:42 · 67 阅读 · 0 评论 -
java 多线程&内置类与静态内置类——50
关键字synchronized的知识点还涉及内置类的使用包括普通内部类和静态内部类原创 2022-06-09 16:38:13 · 167 阅读 · 0 评论 -
java 多线程&多线程的死锁——49
Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这会造成线程“假死”。死锁是程序设计的Bug,在设计程序时要避免双方互相持有对方的锁,只要互相等待对方释放锁,就有可能出现死锁。...原创 2022-06-09 16:15:47 · 296 阅读 · 0 评论 -
java 多线程&同步synchronized方法无限等待问题与解决方案——48
使用同步方法会导致锁资源被长期占用,得不到运行的机会原创 2022-06-09 11:17:26 · 490 阅读 · 0 评论 -
java 多线程&String常量池特性与同步相关的问题与解决方案——47
出现这种情况是因为String的两个值都是"AA",两个线程持有相同的锁,造成B线程不能执行。这就是String常量池所带来的问题,所以大多数情况下,同步synchronized代码块不使用String作为锁对象,而改用其他,例如,new Object()实例化一个新的Object对象,它并不放入缓存池中,或者执行new String()创建不同的字符串对象,形成不同的锁。...原创 2022-06-09 11:04:55 · 194 阅读 · 0 评论 -
java 多线程&同步synchronized(class)代码块可以对类的所有对象实例起作用——46
同步synchronized(class)代码块的作用其实和synchronized static方法的作用一样。原创 2022-06-09 10:46:13 · 320 阅读 · 0 评论 -
java 多线程&同步synchronized static方法可以对类的所有对象实例起作用——45
Class锁可以对类的所有对象实例起作用原创 2022-06-09 09:33:29 · 112 阅读 · 0 评论 -
java 多线程&静态同步synchronized方法与 synchronized(class)代码块——44
关键字synchronized还可以应用在static静态方法上,如果这样写,那是对当前的*.java文件对应的Class类对象进行持锁,Class类的对象是单例的,更具体地说,在静态static方法上使用synchronized关键字声明同步方法时,使用当前静态方法所在类对应Class类的单例对象作为锁。...原创 2022-06-09 09:18:26 · 310 阅读 · 0 评论 -
java 多线程&类Class的单例性——43
Class类用于描述类的基本信息,包括有多少个字段,有多少个构造方法,有多少个普通方法等,为了减少对内存的高占用率,在内存中只需要存在一份Class类对象就可以了,所以被设计成是单例的。...原创 2022-06-09 09:02:40 · 136 阅读 · 0 评论 -
java 多线程&细化验证3个结论——42
synchronized(非this对象x)格式的写法是将x对象本身作为“对象监视器”,这样就可以分析出3个结论·当多个线程同时执行synchronized(x){}同步代码块时呈同步效果。·当其他线程执行x对象中synchronized同步方法时呈同步效果。·当其他线程执行x对象方法里面的synchronized(this)代码块时呈现同步效果。需要注意,如果其他线程调用不加synchronized关键字的方法,则还是异步调用。...原创 2022-06-08 23:18:43 · 125 阅读 · 0 评论 -
java 多线程&不同步导致的逻辑错误及其解决方法——41
如果方法不被同步化,则会出现逻辑上的错误。出现错误的原因是两个线程以异步的方式返回list参数的size()大小,解决办法就是“同步化”。由于list参数对象在项目中是一份实例,是单例的,而且也正需要对list参数的getSize()方法做同步的调用,所以就对list参数进行同步处理。...原创 2022-06-08 17:02:25 · 481 阅读 · 0 评论 -
java 多线程&验证方法被调用是随机的——40
从运行结果来看,同步方法中的代码是同步输出的,所以线程的“进入”与“退出”是成对出现的,但方法被调用的时机是随机的,即线程A和线程B的执行是异步的原创 2022-06-08 16:50:16 · 107 阅读 · 0 评论 -
java 多线程&多个锁就是异步执行——39
验证方法被调用是随机的想使用“synchronized(非this对象x)同步代码块”格式进行同步操作时,锁必须是同一个,如果不是同一个锁,则运行结果就是异步调用,交叉运行。原创 2022-06-08 15:08:51 · 468 阅读 · 0 评论