![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程、高并发编程
记录多线程高并发学习笔记、心得
动机至善
编程的三大境界:
1、初能望文生义、死记硬背,可小成(实现功能);
2、进能变通运用、举一反三,有一得(优化功能);
3、终能深入浅出、知行合一,方大就(凡事自动化)。
展开
-
synchronized详解
1、synchronized既保证可见性又保证一致性,所以使用synchronized的时候,不需要加volatile 2、public void methodName(){synchronized(this){}} 等价于 publicsynchronized void methodName(){} 3、当synchronized修饰静态方法的时候,锁的对象是当前类的Class对象,因为我们知道调用静态方法的时候不需要new 类的对象。注意:类的Class对象一定是单例的,因为同一个类加载器针...原创 2020-08-24 23:23:22 · 172 阅读 · 0 评论 -
模拟死锁
死锁:是指有两个或者多个线程互相持有对方需要的资源,导致涉及到的所有线程都处于阻塞状态,无法继续运行。 import java.util.ArrayList; import java.util.List; public class DeadTest { private static List<String> l1 = new ArrayList<>(); ...原创 2019-05-07 09:16:50 · 361 阅读 · 0 评论 -
Callable实现多线程
运行下面的代码,我们会发现,I'm T..... 和 I'm T0.....会交替输出。通过下面的代码我们可以知道,这种方式相对于Runnable的实现方式,又更加灵活了,因为它可以将处理结果返回(即call方法是有返回值的)。这里顺便总结一下这种方式和实现Runnable接口的方式的区别: 1、Runnable接口复写的是run方法,而Callable接口复写的是call方法 2、Runn...原创 2019-05-05 22:48:16 · 3428 阅读 · 1 评论 -
Runnable实现多线程
下面是通过实现Runnable接口的方式实现多线程的几种写法,这种方式用的相对较多,因为相对于继承Thread类的方式而言,这种方式更加灵活,解决了java单继承的痛点。 写法一: public class ThreadTest { public static void main(String[] args) { new Thread(new T1()).start(...原创 2019-05-05 21:54:28 · 6017 阅读 · 0 评论 -
Thread实现多线程
运行下面的代码,我们会发现T1、T2交替执行。这是实现多线程最简单的方式,它的局限性在于如果当前类已经继承了别的类,就无法使用这种方式来实现多线程了,因为java中只能单继承。 public class MyTest { public static void main(String[] args) { new T1().start(); new T2(...原创 2019-05-05 21:37:58 · 670 阅读 · 0 评论 -
volatile相关知识点总结
volatile的两个作用: 1、保证数据的可见性(底层原理:CPU原语支持,使用缓冲一致性协议) 多线程编程时,每个线程会有自己独立的缓冲(JVM寄存器),对于多个线程共享的数据(堆中变量),不加volatile的情况下,如果Thread1修改了变量的值,不会立刻写回去,这是其他线程读取到的变量值就会和Thread1不一致。 加上volatile关键字以后,如果有一个线程修改了共享变量的值会立刻写回去,同时其他线程独有的变量副本失效。 需要注意的是:volatile只保证可见...原创 2020-08-26 18:35:40 · 144 阅读 · 0 评论