1.谈谈你对同步代码块中同步监视器和共享数据的理解以及各自要求?
同步监视器:俗称锁。①任何一个类的对象都可以充当;②多个线程共用同一把锁。
共享数据:多个线程共同操作的数据。

2.什么情况会产生线程安全问题?
当多个线程同时共享同一个数据,做写的操作时,可能会发生数据冲突问题,即产生线程安全问题。读的操作不会发生线程安全问题。
(比如A在银行取钱,查询起初余额balance=5000;准备取3000;在做取钱操作的时候发生阻塞了,此时A女朋友也用A的账户查询balance=5000;开始取4000,balance更新为1000,取钱成功;A阻塞完成,开始取3000,balance更新为-2000,取钱成功。

3.如何解决线程安全问题?有几种方式?
当线程A在操作共享数据时,其他进程不能参与进来,直到线程A操作完成时,其他线程才可以开始操作共享数据。这种情况即使线程A出现了阻塞也不能被改变。
使用synchronized同步机制或lock锁方式解决。
有两种方式:1.synchronized同步代码块/同步方法

//同步代码块:
synchronized(/*同步监视器*/){// 需要被同步的代码}

2.lock锁

4.synchronized与lock有什么异同?
相同点:解决线程安全问题
不同点:
synchronized机制在执行完相应的同步代码以后,自动地释放同步监视器;
1.synchronized是隐式锁,出了自动域自动释放;Lock是显式锁,lock需要手动启动同步lock()/手动结束同步unlock()/在finally里释放,否则容易出现死锁。
2.Lock只有代码块锁,synchronized有代码快锁和方法锁;
3.使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类

优先使用顺序:Lock–>同步代码块(已经进入了方法体,分配了相应资源)–>同步方法(在方法体外)

关于Lock

  • 从JDK5.0开始,java提供了更强大的线程同步机制–>通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。
  • java.util.concurrent.lock.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。
  • ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁。

如何解决线程安全问题?有几种方式?synchronized与lock有什么异同?相关推荐

  1. 解决多线程安全问题-无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法 (百度-美团)

    解决多线程安全问题-无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法 (百度-美团) 参考文章: (1)解决多线程安全问题-无非两个方法synchronized和lo ...

  2. 解决线程安全问题的两种办法

    package com.xt.java;/*** 创建3个窗口卖票,总票数为100张 使用实现Runnable接口的方式* 问题一:买票过程中,出现了重票.错票-->出现了线程安全问题* 问题出 ...

  3. 解决多线程安全问题的几种方式?

    (1)同步代码块: 在代码块声明上 加上synchronized synchronized (锁对象) { 可能会产生线程安全问题的代码 } 同步代码块中的锁对象可以是任意的对象:但多个线程时,要使用 ...

  4. 4种解决线程安全问题的方式

    前言 线程安全问题,在做高并发的系统的时候,是程序员经常需要考虑的地方.怎么有效的防止线程安全问题,保证数据的准确性?怎么合理的最大化的利用系统资源等,这些问题都需要充分的理解并运行线程.当然关于多线 ...

  5. 多线程的创建方式和解决线程安全问题

    一  基本概念 ①程序(program)是为完成特定任务.用某种语言编写的一组指令的集合.即指一 段静态的代码,静态对象. ②进程(process)是程序的一次执行过程,或是正在运行的一个程序.是一个 ...

  6. Java实现线程安全的几种方式

    文章目录 一.不可变 二.互斥同步 三.非阻塞同步 1. CAS 2. AtomicInteger 3. ABA 四.无同步方案 1. 栈封闭 2. 线程本地存储(Thread Local Stora ...

  7. 如何解决线程安全问题

    如何解决线程安全问题 怎么解决线程的安全问题呢? 基本上所有解决线程安全问题的方式都是采用"序列化临界资源访问"的方式,即在同一时刻只有一个线程操作临界资源,操作完了才能让其他线程 ...

  8. Java解决线程安全问题

    文章目录 背景 1. 线程安全问题 1.1 什么是线程安全? 1.2 产生的原因 1.3 实例(买票超卖问题) 1.4 如何确定是否存在线程安全问题? 2. 如何解决线程安全问题? 2.1 不可变(I ...

  9. Java面试题:线程实现的两种方式及匿名内部类实现

    QUESTION:线程实现的两种方式及匿名内部类实现 ANSWER: 1.多线程两种实现方式 (1)继承Thread     * 定义类继承Thread     * 重写run方法     * 把新线 ...

最新文章

  1. Windows Phone开发(19):三维透视效果
  2. 小站教育携手神策数据,数据赋能留学语言培训教育的智能化探索
  3. html如何让a标签提交表单提交,html post请求之a标签的两种用法解析
  4. Vue 脚手架配置代理
  5. iOS面试中经常问的点 - RunTime
  6. python情感分析预测模型_Python 使用 NLTK 实现简单情感分析--Twitter(推特)分析...
  7. Win10系统特别卡的一个原因
  8. msyql之查询某字段值重复的数据个数
  9. HDU1560 DNA sequence IDA* + 强力剪枝 [kuangbin带你飞]专题二
  10. Linformer 拍了拍 被吊打 Transformers 的后浪们
  11. Unity多个场景叠加或大场景处理方法小结
  12. flash倒计时功能
  13. ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network
  14. openwrt环境下,使用externel commissioning组网openthread
  15. 外国程序员求助:快 40 了,不知道以后该怎么办
  16. 哈哈哈 一个小玩意 感觉就是一个引子 可以拿来玩
  17. Java主要就业方向有哪些?
  18. 什么是LTE(Long Term Evolution)
  19. u-boot-1.3.4 移植到S3C2440 (带有某些解析)
  20. ViewPager写的三字经程序,外加三字经朗读,用了MediaPlayer

热门文章

  1. LeetCode:409、最长回文串
  2. (软件工程复习核心重点)第二章可行性研究-第三节:数据流图
  3. 6-5-1:STL之stack和queue——stack和queue的快速入门、常用接口以及适配器的概念
  4. KMP算法详细讲解(看完不会请打我)
  5. C/C++下载文件_上传文件
  6. Mysql 学习之 SQL的执行顺序
  7. 10个学习Android开发的网站推荐
  8. BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )
  9. 解决ng界面长表达式(ui-set)
  10. 设置ORACLE_HOME环境变量