当前位置:网站首页 > Java教程 > 正文

java高级并发教程



 

这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记。

参考链接:https://www.bilibili.com/video/BV1B7411L7tE


csdn csdn csdn csdn csdn




🔥1.多线程--基础内容

1.Thread状态

​ 6种:新建、运行、阻塞、等待、超时等待、结束(可点击Thread查看源代码)

 

2.Synchronized
  • 非公平锁
  • 可重入锁,

​ Synchronized:是非公平锁(不能保证线程获得锁的顺序,即线程不会依次排队去获取资源,而是争抢,但是结果一定是正确的),是可重入锁(已获得一个锁,可以再获得锁且不会造成死锁,比如synchronized内部可以再写个synchronized函数)

 

3.Lock锁
  • 可重入锁
  • 公平还是不公平锁可以设置(默认不公平锁)
     

    Lock:加锁之后必须解锁,,否则其他线程就获取不到了,所以用包起来。

 

4.总结

​ 在不加锁情况下,多线程会争抢,导致输出顺序、计算结果都会不一致(上面例子结果如果一样是因为只有3个线程,for循环即出错,因为number--这个函数本身不是线程安全的),所以就引入了锁的概念,synchronized,lock保证了输出顺序、计算结果的一致性。

虚假唤醒:在synchronized.wait与lock.condition.await唤醒线程时,是从await代码之后开始运行,所以为了保证能唤醒线程,需要用while语句将代码包含起来。

​ 完整代码

 



🔥2.八锁现象(synchronized、static)

即synchronized、static修饰的函数,执行顺序、输出结果。

结果表明:

​ 1.synchronized修饰的函数:会锁住对象(可以看成锁对象中某个方法),看起来代码会依次执行,而没有锁的方法即不受影响,一来就先执行

​ 2.static synchronized修饰的函数:会锁住类.class(可以不同对象访问的都是同一个函数),所以2个对象访问自己的函数依然还是顺序执行.

​ 3.一个有static,一个没有static:即一个锁类.class,另一个锁对象,不管是同一个对象还是不同对象,就都不需要等待了,不会顺序执行。

1.synchronized

​ 修饰函数会保证同一对象依次顺序执行()

 

2.static synchronized
 



🔥3.Java集合--安全性

 



🔥4.高并发--辅助类

​ 学习链接:https://www.cnblogs.com/meditation5201314/p/14395972.html

1.countdownLatch

Countdownlatch:减一操作,直到为0再继续向下执行

 

2.cyclicbarrier

Cyclicbarrier:+1操作,对于每个线程都自动+1并等待,累计到规定值再向下执行,

 

3.semaphore

semaphore:对于规定的值,多个线程只规定有指定的值能获取,每次获取都需要最终释放,保证一定能互斥执行

 



🔥5.读写锁(ReadWriteLock)

​ ReadWriteLock也是多线程下的一种加锁方式,下面列出ReadWriteLock和synchronized对多线程下,保证读完之后在写的实现方式

 



🔥6.线程池

1.集合--队列(阻塞队列、同步队列)

  • 阻塞队列:blockingQueue(超时等待--抛弃,所以最后size=1)
     
  • 同步队列:synchronizeQueue(类似于生产者消费者)
     

2.线程池基本概念(三大方法、七大参数、四种拒绝策略)
  • 三大方法:newSingleThreadExecutro(单个线程),newFixedThreadPool(固定大小线程池),newCachedThreadPool(可伸缩)
     
  • 七大参数:
     
  • 四种拒绝策略:
     



🔥7.Stream(4个函数式接口、Lambda、异步回调)

1.函数式接口

​ 学习链接:https://www.cnblogs.com/meditation5201314/p/13693089.html


2.Lambda表达式

​ 学习链接:https://www.cnblogs.com/meditation5201314/p/13651755.html


3.异步回调
 



🔥8.单例模式

1.饿汉模式(程序一启动就new,十分占内存)
 

2.懒汉模式(DCL模式:双重检测,需要的时候才new)

1.第一层if没有加锁,所以会有多个线程到达if
2.如果内部new对象指令重排,就会导致有些线程认为lazyManModel有对象,所以会直接返回lazyManModel(实际为null)
3.所以需要加上valitile防止指令重排

 



🔥9.Volatile和Atomic

​ 学习笔记:https://www.cnblogs.com/meditation5201314/p/13707590.html

🔥10.Java中锁

1.公平锁(FIFO):Lock锁可以自定义,synchronized
2.非公平锁(允许插队):Lock锁可以自定义
3.可重入锁(获取一个锁再获取其他锁不会造成死锁):lock锁和synchronized
4.自旋锁:得不到就一直等待(Atomic.getAndIncrement底层就是自旋锁)
 
5.死锁命令排查

                            

  • 上一篇: java教程list
  • 下一篇: mc驯马教程java
  • 版权声明


    相关文章:

  • java教程list2025-03-09 22:58:04
  • java 教程 书籍2025-03-09 22:58:04
  • groovy java教程2025-03-09 22:58:04
  • java教程438集2025-03-09 22:58:04
  • java公路车拼装教程2025-03-09 22:58:04
  • mc驯马教程java2025-03-09 22:58:04
  • java告白代码教程2025-03-09 22:58:04
  • java按键使用教程2025-03-09 22:58:04
  • java mqtt教程2025-03-09 22:58:04
  • java 教程ppt2025-03-09 22:58:04