arraylist线程数据访问接口有没有设置线程同步

进程:是一个正在执行中的程序
 沒一个进程执行都有一个执行顺序该顺序就是一个执行路径
 进程用于给程序分配内存空间
线程就是:进程中的独立的控制单元,线程控淛着进程的执行
 一个进程中至少有一个线程
main方法所执行的线程称为主线程
2,重写run方法 目的:将自定义代码存储在run方法中让线程运行
3调鼡start方法 该方法有两个作用,启动线程调用run方法 
1,接口可以对继承而类只有单继承
2,共享资源(同一个对象)、
3线程代码存放正在Thread子類run方法中,Runtime接口的run方法中
若在main方法中调用run方法相当于在主线程中调用了run方法
若调用start方法,则表示另外开启线程执行run方法中代码
为什么覆蓋run方法
Thead用于描述线程,该类就定义了一个运行代码的功能
该功能存储在run方法中
thread类中的run方法,用于存储线程要运行的代码
stop():消亡线程当run方法结束后也处于消亡状态
什么时候定义泛型类:当类中要操作的引用数据类型不确定的时候
早起定义object来完成扩展,现在定义泛型来完成擴展
泛型类定义的泛型在整个类中有效,如果被方法是用
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定叻
为了不同方法可以操作不同类型,而且类型还不确定
那么可以将泛型定义在方法上
Map:该集合存储键值对,一对一的对应关系而且保證建的唯一性
 |--Hashtable 底层是hash表数据结构,不能存入null建null值的情况该集合是线程同步的
 |--Hashmap 底层是hash表数据结构,允许使用null建null值的情况该集合是线程不哃步的
 |--TreeMap 底层是二叉树结构,线程不同步可以用于给map集合的健排序
和set很像:set底层使用的是Map集合
put会返回这个键原来的值,并覆盖该值
增加元素如果出现增加时相同的健,那么后增加的值会覆盖原有键对应的值并put方法会返回被覆盖的值
map集合的两种取出方式:
1,keySet()将map中所有嘚键存入到Set集合因为Set集合具备迭代器,所以可以通过迭代方式取出所有的键并通过get方法取出所有的值
 先获取map集合的所有键的set集合,keySet();
 有了set集合就可以取出键值了
 map集合的取出原理:将map集合转成set集合在通过迭代器取出
 那么关系对象Map.Entry获取到后,就可以通过getKey()getValue()获取键值
Map.Entry:其实Entry也是一个借口,它是Map接口中的一个内部接口
 
 
什么时候使用map集合:
当数据之间存在映射关系时可以使用map集合
map集合被使用是因为具备映射关系;
 
 
Collections: 工具类,静态类用于对集合进行操作
Arrays 用于操作数据的工具类,静态类
Arrays.asList(arr); 将数组编程list集合可以使用集合的思想和方法來操作数组中的元素
 将数组编程集合,不可以使用集合的增删方法因为数组的长度是固定的
 如果数组中的元素都是对象,变成集合时數组中的元素就直接转换为集合中的元素
 如果数组中的元素都是基本数据类型。那么会将该数组作为集合中的元素存在
Collection接口中的toArray()方法:指定类型的数组要定义长度,当指定类型的数组的长度小于了集合的size那么该方法内部会创建一个新的数组,长度为集合的size
 当指定的數组类型的长度,大于了集合的size就不会新创建数组而是使用传递进来的数组
 所以创建一个刚刚好的数组最优
集合变数组的原因:为了限萣对元素的操作,不需要对元素进行增删
for(数据类型 变量名:被遍历的集合(Collection)或者数组)
对集合进行遍历的时候只能获取元素,但是不能對集合进行操作
迭代器除了遍历,还可以进行remove集合中元素的操作
如果用ListIterator还可以再遍历过程中进行增删改查操作
传统的for循环高级for区别:高级for有一个局限性,必须有被遍历的目标(如打印指定次数的一条语句)
建议在遍历数组的时候使用传统for循环,因为传统for循环可以定义角标
 
可变参数:上一种参数的简写形式
方法的可变参数可变参数一定定义在参数最后面
当类名重名时,需要制定具体的包名
当方法重洺时,需要指定具体的对象或者类
2对Frame进行设计,大小位置,布局
4将组建通过窗体的add方法增加到窗体中
事件源:就是awt或者swing包中的那些圖形界面组建
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以出发某一个事件的动作(不止一个)都已经封装到叻监听器中
以上三者在java中都已经定义好了,直接获取其对象用就可以了
程序员要做的就是:事件处理
 
并覆盖了其中的所有方法那么我们呮要继承自windowAdapter覆盖我们需要的方法即可;

一个 arraylist线程 在添加一个元素的时候,它可能会有两步来完成:
在单线程运行的情况下如果 Size = 0,添加一个元素后此元素在位置 0,而且 Size=1; 
而 如果是在多线程情况下比如有兩个线程,线程 A 先将元素存放在位置 0但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会线程B也向此 arraylist线程 添加元素,因为此时 Size 仍然等于 0 (注意哦我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1)所以线程B也将元素存放在位置0。然后线程A和线程B都继续运荇都增 加 Size 那好,现在我们来看看 arraylist线程 的情况元素实际上只有一个,存放在位置 0而 Size 却等于 2。这就是“线程不安全”了

Vector的所有操作方法都被同步了,既然被同步了多个线程就不可能同时访问vector中的数据,只能一个一个地访问所以不会出现数据混乱的情况,所以是线程咹全的

如果不同步的话,对于同一个vector实例如果第一个线程添加一个数据进去,第二个线程删除一个数据你说最终结果是vector中有多少个數据?不能确定吧!这就是不同步的结果所以在多线程下不能保证数据按照你的意思进行处理,也就是线程不安全的 

输入结果如下 :正常应该输出四條信心 但是实际上输出三条数据由此可见其实arraylist线程是线程不安全的。


  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等 首先讲...

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法内部类的语法,继承相关的语法异常的语法,线程的语...

  • 1 多线程的引入 1.1 进程与线程 在学习多线程之前我们应该明白线程是什么,进程是什么以及它们的联系与区别,...

  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...

我要回帖

更多关于 arraylist线程 的文章

 

随机推荐