2019独角兽企业重金招聘Python工程师标准>>>

1.ThreadLocal用法

在java中,如果一个变量需要被多个线程访问,可以使用volatile来声明它为“易变的”。而假如一个变量要被持有它的某个线程独享,在java中,它可以使用java.lang.ThreadLocal类来实现线程本地存储的功能。这样,数据便只在同一个线程内可见和共享,因此,即便不同步也能保证线程之间不出现数据争用。

ThreadLocal使得各线程能够保持各自独立的一个对象,通过ThreadLocal.set()来设置对象的值,保存在每个线程自己都有的一个map对象当中,每个ThreadLocal对象会有一个线程范围内唯一hashcode作为key,ThreadLocal.get()内部通过这个key从map中取值,因此取出来的是各自自己线程中的对象,ThreadLocal实例事实上只是作为map的key来使用的

ThreadLocal例子

package com.arch.demo;public class ThreadLocalTest {public static void main(String[] args) {ThreadLocal<Integer> count = new ThreadLocal<>();ConcurrentThread t1 = new ConcurrentThread(count);ConcurrentThread t2 = new ConcurrentThread(count);ConcurrentThread t3 = new ConcurrentThread(count);ConcurrentThread t4 = new ConcurrentThread(count);t1.start();t2.start();t3.start();t4.start();}static class ConcurrentThread extends Thread {ThreadLocal<Integer> threadLocal = new ThreadLocal<>();private ConcurrentThread(ThreadLocal<Integer> count) {this.threadLocal = count;}@Overridepublic void run() {for (int i = 1; i < 10; i++) {if (threadLocal.get() != null) {threadLocal.set(threadLocal.get() + 1);} else {threadLocal.set(1);}System.out.println("Thread:" + this.currentThread().getName() + ",Count:" + threadLocal.get());}}}
}

2.volatile用法

volatile是轻量级的synchronized, 它在多处理器开发中保证了共享变量的"可见性", 可见性是指一个线程在修改共享变量的值时,其他的线程可以读到这个修改的值

3.Synchronized与ReentranckLock区别

  1. Lock和 synchronized 有一点明显的区别 —— lock 必须在 finally 块中释放

2. Lock可以实现公平锁或不公平锁,而Synchronized是不公平的,而且永远都是不公平的。但 JVM 保证了所有线程最终都会得到它们所等候的锁,但是Lock作为默认设置,把公平设置为false

3. Lock性能和伸缩性都比较好(在JDK5.0),但是大多数情况Synchronized就足够了,而且更容易理解

4.ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。也就是说ReentrantLock在同一个时间点只能被一个线程获取

4. 重要点

1).当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块

public class SynchronizedThread implements Runnable {@Overridepublic void run() {synchronized (this){for(int i = 0; i < 5; i++){System.out.println(Thread.currentThread().getName() + " synchronized loop" + i);}}}public static void main(String[] args) {Runnable runnable = new SynchronizedThread();new Thread(runnable,"a").start();new Thread(runnable,"b").start();}
}

2).当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块

转载于:https://my.oschina.net/chenxiaobian/blog/633635

多线程并发的解决方案 volatile synchronized notify notifyAll wait关键字分析相关推荐

  1. 线程方法notify/notifyAll源码分析

    众所周知,使用notify/notifyAll方法能唤醒wait等待的线程,那么在底层源码究竟做了些什么呢? 本章内容要解决的问题 问题1:notify/nofityAll真的唤醒了线程吗? 问题2: ...

  2. 多线程并发问题 黄牛卖票和模拟龟兔赛跑问题分析

    数据共享带来的并发问题 多线程有两个经典案例,12306买票问题和上厕所问题

  3. (四)Java中的多线程之间实现同步+多线程并发同步

    一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...

  4. 如何使用 volatile, synchronized, final 进行线程间通信

    2019独角兽企业重金招聘Python工程师标准>>> 你是否真正理解并会用volatile, synchronized, final进行线程间通信呢,如果你不能回答下面的几个问题, ...

  5. python多线程并发

    python多线程并发 遍历数据库,然后查询历史记录,然后分析 数据查询100ms,这时需要3分钟,加了并发处理后,需要1.2分钟 后来数据库加了索引,需要6秒就可以了, 总结:加索引能带来30倍的优 ...

  6. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  7. Java并发(四)——synchronized、volatile

    文章目录 synchronized.volatile 1 Java内存模型JMM 2 伪共享 3 指令重排 4 synchronized 5 volatile 6 synchronized和Lock ...

  8. Java 多线程 4:wait() 和 notify()/notifyAll()

    轮询快速到底 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A 线程做 int 型变量 i 的累加操作,B 线程等待 i 到了 1 ...

  9. java 多线程 notifyall_java多线程之 wait(),notify(),notifyAll()

    这几天在写一个java多线程服务器的功能,用到这些基础,自叹基础知识还需巩固,先写上一下这些说明,供自己和大家参考 wait(),notify(),notifyAll()不属于Thread类,而是属于 ...

最新文章

  1. 年轻人买菜只愿意走670米,每日优鲜、叮咚买菜等生鲜电商们依然“难送达”
  2. PoE交换机不供电了该怎么办?
  3. 做对三件事,你也能像聪明人一样高速成长!【文末有福利】
  4. Python模块之: fractions模块-分数模块
  5. jquery 插件开发小组
  6. 中文编程对中文编程是否是一枚银弹
  7. 几款少儿编程软件介绍
  8. Dubbo实现分布式架构原理
  9. CVPR-2020 AAAI2020 CVPR-2019 NIPS-2019 ICCV-2019 IJCAI-2019 论文超级大合集下载,整理好累,拿走不谢
  10. 2023二建建筑施工备考第二天Day04
  11. CCF 行车路线 100分
  12. Ubuntu21.10配置阿里云DNS方法
  13. jquery 会话存储_5个jQuery打字和会话插件
  14. 教学常用计算机软件包括,计算机软件包括( )。
  15. 平心静气,方法得当,做事方有效。
  16. C#_Unicode字符串 转中文编码
  17. 如何利用油猴脚本(tampermonkey)免费使用知网维普?
  18. 1.算法入门必知必会:时间复杂度和空间复杂度
  19. Python 使用tcp协议模拟 在线对话聊天(即时通讯)
  20. 地质学与计算机的联系,计算机与地质学

热门文章

  1. 马斯克:十年内可把人脑与AI计算机连接起来
  2. SAP MIGO 报错-在例程WERT_SIMULIEREN字段NEUER_PREIS中字段溢出-
  3. SAP LSMW 导入物料主数据报错 - You have not fully maintained the descriptions - 之分析
  4. (已解决)IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY。Someone could be eavesdropping on you
  5. IEEE年终AI大盘点:网友教会GPT-3骂人、DeepMind再造机器人
  6. 李彦宏:用“工程思维”做自动驾驶
  7. 术,路,心:陈天桥的大脑行旅
  8. 六大“未来式”存储器,谁将脱颖而出?
  9. AI技术的天花板:图灵机无法建立“自我”意识的概念
  10. Math类(工具类)