随笔分类 - 多线程
摘要:JMM是一种规范, 目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、 编 译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。 目的是保证并发编程场景中的原子性、可见性和有序 性。
阅读全文
摘要:1-volatile 当一个变量被 volatile 修饰的时候, 任何线程对其做的写操作都会被立即刷新到主内存中, 并且强制让那些缓存了该变量 的线程内的该变量数据清空, 需要从主内存中重新读取最新数据。 volatile 修饰的变量, 并不是让线程直接操作主内存获取数据, 还是需要将变量拷贝到工
阅读全文
摘要:1 什么是CAS 当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败, 但失败的线程并不会被 挂起,仅是被告知失败, 并且允许再次尝试,当然也允许失败的线程放弃操作。 CAS是一种原子操作。 2 ABA问题 所谓ABA问题,就是一个值原来是A,变成了B,又变回了A。 这
阅读全文
摘要:1 死锁来源 死锁最初由一个悲惨的故事说起,话说一群哲学家一起聚餐,然后在每个人的左边和右边分别放着一根筷子,而只有同时抓到两根筷子,才能正常吃饭,于是,不幸的故事发生了,每位哲学家都只抓到一根筷子,且都不愿意释放手中的筷子,于是,最终一桌的饭菜就这么浪费了。 不知道这个故事是谁发明的,但确实形象说
阅读全文
摘要:1-悲观锁 它总是认为每次访问共享资源时会发生冲突, 所以必须对每次数据操作加上 锁, 以保证临界区的程序同一时间只能有一个线程在执行。 1-1 使用场景 悲观锁多用于”写多读少“的环境,避免频繁失败和重试影响性 能。 2-乐观锁 乐观锁通常是使用一种称为CAS的技术来保证线程执行的安全性。 由于无
阅读全文
摘要:如果这个是面试官直接问你的问题,你会怎么回答? 一个专业的描述是, 当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的 那么我们如何做到线程安全? 实现线程安全的方式有多种,其中在源码中常见的方式是,采用sync
阅读全文
摘要:1-线程与进程 单核 CPU 一个时间片里只能执行一个进程。 但是因为它切换速度很快,所以我们感受不到,就造成了一种多进程的假 象。 (多核 CPU 那真的就是并行执行的了。) 并行才是真正意义上的同一时刻可以有多个任务同时执行 2 互斥锁 如果公共区域(堆内存)的数据,要被多个线程操作时, 为了确
阅读全文
摘要:1-继承thread class MyThread extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()+":running....."); } } publ
阅读全文
摘要:如果这个是面试官直接问你的问题,你会怎么回答? 一个专业的描述是, 当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的 那么我们如何做到线程安全? 实现线程安全的方式有多种,其中在源码中常见的方式是,采用sync
阅读全文
摘要:有哪几种方式? 继承Thread 实现Runnable接口 实现Callbale接口 但实际后两种,更准确的理解是创建了一个可执行的任务,要采用多线程的方式执行, 还需要通过创建Thread对象来执行,比如 new Thread(new Runnable(){}).start();这样的方式来执行。
阅读全文
摘要:info 比如 线程不安全类:hashmap,arraylist 线程安全:stringbuffer,concurrenthashmap 在多线程环境下,对一个对象访问,不需要额外加锁(synchronized),就可以,那这个对象就是线程安全. 比如stringBuffer 因为这个每个方法都加了
阅读全文
摘要:1 多线程容易出现问题 举个例子,电影院卖票,一共卖100张票,分3个窗口,用多线程来模拟,看会发生什么? 1-1 创建一个卖票任务,实现Runnable接口 public class Ticket implements Runnable{ // 总共100 private int ticket =
阅读全文
摘要:1 方式一:创建Thread的子类对象 1-1 创建一个线程,继承 Thread,重写run方法 public class MyThread extends Thread{ public MyThread(String name){ super(name); } @Override public v
阅读全文