技术点集(面试)

2023-11-12

  1. 怎么使用 ConcurrentHashMap 才能是线程安全的?

    package util;
    
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class test {
    	public static Map<String, Integer> chm = new ConcurrentHashMap<String, Integer>();
    
    	public static void main(String[] args) {
    		test.chm.put("test", 1);
    		tht t1 = new tht();
    		t1.start();
    		for (int i = 1; i < 1000; i++) {
    			th t = new th(i);
    			t.start();
    		}
    	}
    }
    
    class th extends Thread {
    	private int number = 0;
    
    	public th(int _number) {
    		number = _number;
    	}
    	@Override
    	public void run() {
    		boolean bo = true;
    		while (bo) {
    			int state = 0;
    			state = (Integer) test.chm.get("test");
    			if (state == 9) {
    				System.out.println("线程:" + number + ",停止!");
    				bo = false;
    			} else {
    				System.out.println("线程:" + number + ",state=" + state + ",time:" + System.currentTimeMillis());
    			}
    		}
    	}
    }
    
    class tht extends Thread {
    	public tht() {
    	}
    	@Override
    	public void run() {
    		boolean bo = true;
    		while (bo) {
    			int state = 0;
    			state = (int) (Math.random() * 1000000);
    			test.chm.put("test", state);
    			if (state == 9) {
    				System.out.println("线程:-1,停止,time=" + System.currentTimeMillis()
    						+ ",--------------------------------------------");
    				bo = false;
    			}
    		}
    	}
    }

    运行多次运行后出现结果:

    线程:237,state=178474,time:1348219230671
    线程:-1,停止,time=1348219230671,--------------------------------------------
    线程:236,state=178474,time:1348219230671

    线程:337,state=178474,time:1348219230671

    线程:876,state=178474,time:1348219230671

    ConcurrentHashMap不是线程安全的么,那么多个线程同时读和改的时候,从运行结果看改的线程获取到锁以后,读的线程还是可以继续执行的.到底怎么使用ConcurrentHashMap才能保证数据一致?

    问题补充:正常应该是,改state赋值为9后,所有读线程停止工作.但改的线程put时,读的线程并没有等待放锁后在读呢?

    解答:
    我不知道这位兄台有没有测试过,加不加synchronized效果是一样的;本身ConcurrentHashMap本身就是线程安全的,这个安全只存在于put和get操作,之所以出现楼主这种情况,就是你说的线程调度问题,楼主把这个//System.out.println("线程:"+number+",停止!");  去掉注释后运行,是不是可以看到所有的线程最终停止了;前面多了些
    线程:236,state=178474,time:1348219230671
    线程:337,state=178474,time:1348219230671
    线程:876,state=178474,time:1348219230671
    
    这样的信息,为什么?
    那是因为在chm被插入9之前,有些线程比如A线程运行到int state = (Integer)test.chm.get("test"); 此时得到state不是9,线程调度切换到插入9的线程B,此test.chm被插入9,B结束;切换为A继续执行,发什么什么,打印了这句:
    线程:236,state=178474,time:1348219230671
    因为这里的state是插入9之前的值;
    什么时候结束,下一次循环重新得到的state就是9了。
    所以说不论加不加synchronzied都会出现这种效果,线程调度的问题;
    
    总结:
    (1)ConcurrentMap是线程安全的,这种安全只存在于对他自己的操作,不能保证外部;
    (2)线程调度可能引起开始错误的结果。
















  2. ======================To be Continued======================
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

技术点集(面试) 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett

随机推荐

  • STM32基于IIC协议的温湿度(AHT20)采集

    STM32基于IIC协议的温湿度 AHT20 采集 文章目录 STM32基于IIC协议的温湿度 AHT20 采集 1 IIC总线协议 1 1 什么是IIC协议 1 2 IIC协议的物理层和协议层 1 2 1 物理层 1 2 2 协议层 1
  • orm模型的查询方法集合

    目录 3 4 1 基本查询 3 4 2过滤查询 3 4 2 2 模糊查询 3 4 2 3 空查询 3 4 2 4 范围查询 3 4 2 5 比较查询 3 4 2 6 日期查询 3 4 3 1 F对象 3 4 3 2 Q对象 values 返
  • Aborted (core dumped) Assertion `Engine.getNbBindings() == 4' failed.

    记录一次特别粗心的错误 错误代码位置 assert的作用是现计算表达式 expression 如果其值为假 即为0 那么它先向stderr打印一条出错信息 然后通过调用 abort 来终止程序运行 需要 inputname 3 output
  • 垂直广告是什么意思_网上常看到带货这个词,那么带货到底是什么意思?又要怎么通过平台带货呢?...

    网上常看到带货这个词 那么带货到底是什么意思 又要怎么通过平台带货呢 直播带货就是通过短视频平台 吸引消费者来购买自己所售卖的产品 可以投放广告或是与达人合作进行带货 短视频 品牌营销优势 新一代广告宠儿 5G时代即将来临 人们越来越习惯且
  • HTML5----FormData实例用法

    ajax 异步上传文件 1 前言 在网页与后台的交互中 用的最多的网络交互方式之一就是ajax ajax 是免刷新页面就能从进行post与get方式的提交表单和获取服务端数据 但是在原先的ajax中 是不能携带文件上传的 但是由于h5里面的
  • Mysql数据库手册

    数据库基本概念 1 数据库 就是数据的仓库 由表 关系 操作对象组成 2 表 由行和列组成 数据都存放在表中 由于mysql是关系数据库 所以表又被称为关系 3 字段 就是属性 4 记录 一行数据就是一条记录 也是一条实体 需要设置主键 5
  • 基于惯性动作捕捉技术进行快速动画制作教程

    长久以来动画制作流程上有着诸多不可回避的问题 尤其在于角色动画的制作周期和动画效果方面 一般来说 每一秒钟的角色动画都需要动画师手动关键帧制作耗费8小时才能完成 也就是说 一个动画师每个月只能制作出22秒动画 动作捕捉技术为动画制作者带来福
  • Elasticsearch-基本命令

    基本命令 创建索引 添加数据 删除数据 简单查询 复杂查询1 复杂查询2 获得所有index 获得所有mapping type 根据某个字段精确查找 api的分组查询 bool查询 创建索引 put http localhost 9200
  • LSTM生成文本(字符级别)

    20200817 引言 在网上看到过一些利用深度学习来生成文本的文章 不管生成宋词也好 生成小说也好 各种各样 都是利用深度学习的模型来生成新的东西 之前的时候 我也一直觉得 他们这种生成方式 应该就是记忆性的东西 他并没有真正的从语义的角
  • jdbc导出mysql数据库_原生JDBC方式导出MySQL数据库

    现在的应用系统越来越多的都是业务系统与数据库系统是分离的 这里就会涉及到数据库备份的问题 如果业务系统与数据库是在同一服务器 可以很简单的用mysql自带的命令 mysqldump databases dbName gt dbNameBak
  • stm32 mqtt 如何判断心跳包发送成功_Dubbo 现有心跳方案总结以及改进建议

    1 前言 设计一个好的心跳机制并不是一件容易的事 就我所熟知的几个 RPC 框架 它们的心跳机制可以说大相径庭 这篇文章我将探讨一下如何设计一个优雅的心跳机制 主要从 Dubbo 的现有方案以及一个改进方案来做分析 2 预备知识 因为后续我
  • linux的inode暴增

    author skate time 2012 04 26 linux的inode暴增 今天刚到公司 接收到一个报警短信 一个数据库的inode使用率达到99 root DBtmp df h Filesystem Size Used Avai
  • 我 JS 写的好好的,为什么要用那么复杂的 TS

    今年前端面试有个很有意思的现象 最经典的 JavaScript 基础类面试题 不在被面试官宠幸 原因很简单 现在市场经济收紧 公司的项目决策中往往切割掉了边角试错成本 而 TypeScript 无疑更适合构建大项目和管理 就像 Java 和
  • 彻底理解embedding

    本文转载自https blog csdn net weixin 42078618 article details 84553940 版权问题请联系博主删除 首先 我们有一个one hot编码的概念 假设 我们中文 一共只有10个字 只是假设
  • 毕业设计记录-Pytorch学习-自己手写数字识别

    今天用之前的模型训练手写数字数据集 训练了50轮 效果如下 然后我就准备用自己手写的数字来检验看看 模型的准确率 自己找的一些数字图片 但是经过测试全部预测成3 很不解 搞了好几个小时 到最后无意间看到他的数据集的时候才知道哪出了问题 这是
  • Linux网络服务部署yum仓库

    目录 1 Yum概述 2 Yum实现过程 3 Yum配置文件 3 1yum主配置文件 etc yum conf 3 2仓库设置文件 etc yum repos d repo 4 yum命令详解 5 源地址 6 搭建仓库的方式 6 1搭建本地
  • MVC,MVP和MVVM架构解析

    文章目录 关于架构 框架和设计模式三者的说明 一 MVC 1 概念 2 结构 3 模式 4 优缺点 5 适用场景 二 MVP 1 概念 2 结构 3 与MVC对比 4 优缺点 5 适用场景 三 MVVM 1 结构 2 解析 3 MVVM架构
  • Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 如上图所示 首先java源代码文件 java后缀 会被java编译器编译为字节码文件 class后缀 然后再让类加载器加载各个类的字节码文件 加载完毕后 交由JVM执行引擎执行 在整个执行过程中 JVM会用一
  • spdlog日志库说明文档(超详细)

    spdlog日志库说明文档 超详细 spdlog是一个开源 快速 只有头文件的C 11日志库 code地址在https github com gabime spdlog 基础示例在https github com gabime spdlog
  • 技术点集(面试)

    怎么使用 ConcurrentHashMap 才能是线程安全的 package util import java util Map import java util concurrent ConcurrentHashMap public c