当前位置: 首页 > news >正文

Java 同步容器

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

同步容器有两类:

  • Vector、Stack、HashTable
  • Collections类中提供的静态工厂方法创建的类

Vector 实现了List接口,和ArrayList类似,但方法都是synchronized方法,即进行了同步措施。

Stack 类似Vector使用synchronized方法同步,是继承Vector的。

HashTable实现了Map接口,类似HashMap,但是HashTable进行了同步处理,而HashMap没有。

Collections类是一个工具提供类,提供了大量的方法,如对集合或者容器进行排序查找等操作,还提供了静态工厂方法来创建同步容器类。


HashMap和HashTable区别?Hashmap key可以是任何类型吗?

  • 1.HashTable的方法是同步的,方法前面都有synchronized,HashMap未同步,在多线程场景要手动同步。可以通过Map m = Collections.synchronizedMap(new HashMap())对HashMap进行同步操作。
  • 2.HashTable不允许有null值,key和value都不行,HashMap都可以有null。
  • 3.HashTable使用Enumeration遍历,HashMap使用iteration遍历。
  • 4.HashTable中hash数组大小默认是11,增加方式是old*2+1。HashMap中hash数组大小默认是16,一定是2的倍数。
  • 5.hash值使用不同,HashTable直接使用对象的hashCode,HashMap重新计算hash值。

LinkedList ArrayList区别

ArrayList基于数组,LinkedList基于链表Arraylist,查找快;LinkedList插入删除快;随机查找频繁用ArrayList,插入删除频繁用LinkedList。


ArrayList,Vector,HashMap,HashTable扩容机制

数组初始容量扩容
ArrayList10old*3/2+1
Vector10old*2
HashMap16达到阈值扩容,为原来两倍
HashTable11达到阈值扩容,old*2+1

Concurrent包

  • semaphore信号量用来表示可用资源的数目,如果请求资源超过这个数,就阻塞这一线程。
  • callable接口,实现call函数,有返回值可以得到call函数的返回值判断call函数是否执行完毕。
  • Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callble任务的状态和得到Callblede的返回结果。Future提供了get()方法让我们可以等待Callable结束并获取他的执行结果。
  • Future Task是Future的一个基础实现,我们可以将他同Exexcutors使用处理异步任务。

Java Concurrency API中的Lock接口

  • Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。
  • 可以使锁更公平。
  • 可以使线程在等待锁的时候响应中断,可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间。
  • 可以在不同的范围,以不同的顺序获取和释放锁。

转载于:https://my.oschina.net/u/1046919/blog/1539269

相关文章:

  • activeMQ使用注意
  • 软件工程第二次作业----(1)补交
  • Android学习笔记(十六)——数据库操作(上)
  • IPS简单使用方法
  • Android--JNI编程详解
  • shiro中的shiro:principal /标签的使用
  • Facebook Like Button在IE上的bug
  • linux安装VNC服务
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 传球接力
  • 数据库表分割技术浅析
  • number 90分的暴力
  • Hybrid App是如何实现网页语言与程序语言的混合?谁占主体?
  • 推荐一个linux下的web压力测试工具神器webbench
  • Jquery(四)——动态篇
  • 【Linux系统编程】快速查找errno错误码信息
  • docker-consul
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Hibernate【inverse和cascade属性】知识要点
  • java8 Stream Pipelines 浅析
  • Laravel Telescope:优雅的应用调试工具
  • Logstash 参考指南(目录)
  • python docx文档转html页面
  • SpriteKit 技巧之添加背景图片
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 京东美团研发面经
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 软件开发学习的5大技巧,你知道吗?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序测试方案初探
  • 再谈express与koa的对比
  • 找一份好的前端工作,起点很重要
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • kubernetes资源对象--ingress
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (转) Face-Resources
  • (转)EOS中账户、钱包和密钥的关系
  • (转)ORM
  • .bat批处理(六):替换字符串中匹配的子串
  • .Net - 类的介绍
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ??javascript里的变量问题
  • @RunWith注解作用