摘要: volatile保证了线程之间的可见性。即某个线程修改了一个共享变量,这个变量立刻对所有线程可见。 volatile保证了指令重排序:用volatile修饰的共享变量在读、写时会加入一个内存屏障,保证了指令重排序。 volatile可以保证可见性、有序性,但是不能保证原子性。 阅读全文
posted @ 2023-05-28 21:57 程序员_YHB 阅读(20) 评论(0) 推荐(0)
摘要: CAS即比较并交换,是一种非阻塞式锁,也称为乐观锁,在无锁的情况下保证线程操作共享资源的原子性。 工作原理:采用CAS的方式修改共享资源时会读取共享资源作为一个预期值,在进行比较,如果预期值和当前值一样,那么就会更新成功,如果不一样,会采用自旋的方式再次获取共享资源的值尝试完成更新,当自旋次数达到一 阅读全文
posted @ 2023-05-28 21:50 程序员_YHB 阅读(171) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2023-05-28 21:35 程序员_YHB 阅读(29) 评论(0) 推荐(0)
摘要: JDK1.6时synchronized锁有: 偏向锁:在一段时间只有一个线程使用锁,此时就可以使用偏向锁,第一次获取到锁需要CAS操作,之后要再次获取锁,只需要在获取锁时判断当前线程id是否为已经获取锁的线程id,不需要CAS操作,提高了性能。 轻量级锁:多个线程交替持有锁,但是没有发生竞争,此时就 阅读全文
posted @ 2023-05-28 21:31 程序员_YHB 阅读(26) 评论(0) 推荐(0)
摘要: synchronized对象锁采用互斥的方式使得在同一时刻只有一个线程能够持有锁并操作共享资源,如果其它线程想要获取锁就会进入阻塞状态,从而保证了线程安全问题。 synchronized底层原理:synchronized的实现基于JVM的锁监视器(monitor),每个JVM都有维护自己的一套锁监视 阅读全文
posted @ 2023-05-28 21:16 程序员_YHB 阅读(69) 评论(0) 推荐(0)
摘要: (1)使用退出标志,让run()方法运行结束,线程正常停止。 (2)调用stop()方法强行终止线程,不建议使用该方法,容易产生死锁。 (3)使用interrupt方法中断线程。 阅读全文
posted @ 2023-05-28 16:36 程序员_YHB 阅读(90) 评论(0) 推荐(0)
摘要: (1)wait()方法是object类的方法,sleep是Thread类的静态方法。 (2)wait()方法需要和锁搭配使用,线程调用wait()方法会释放锁,而sleep()方法不需要和锁搭配使用,线程调用sleep()方法不会释放锁。 (3)线程调用wait()方法需要其它线程调用notify( 阅读全文
posted @ 2023-05-28 16:33 程序员_YHB 阅读(11) 评论(0) 推荐(0)
摘要: notify()方法随机唤醒一个处于等待的线程。 notifyAll()方法唤醒所有处于等待的线程。 阅读全文
posted @ 2023-05-28 16:29 程序员_YHB 阅读(20) 评论(0) 推荐(0)
摘要: 在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在 一个线程中启动另一个线程,另外一个线程完成该线程继续执行。 阅读全文
posted @ 2023-05-28 16:26 程序员_YHB 阅读(27) 评论(0) 推荐(0)
摘要: 线程有六种状态: 新建:当线程被创建时,还没有调用start()方法。 可运行:调用start()方法后,等待CPU调度。 阻塞:线程没有获取到锁进入阻塞状态。 等待:线程获取到锁之后由于条件不满足调用wait()方法后释放锁进入等待状态,当其它持有锁的线程调用notify()或者notifyAll 阅读全文
posted @ 2023-05-28 16:22 程序员_YHB 阅读(57) 评论(0) 推荐(0)