线程安全不安全的辅助理解,可以拿这个例子自己去运行看看

public class Test {
	//LinkedList线程不安全
	//List<Integer>list=new LinkedList<Integer>();
	//Vector线程安全
	List<Integer> list=new Vector<Integer>();

	public static void main(String[] args)  {
		Test test=new Test();

		ThreadA tA = test.new ThreadA();
		ThreadB tB = test.new ThreadB();

		tA.start();
		tB.start();
		try{
			tA.join();
			tB.join();
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		System.out.println("list size:"+test.list.size());

	}
	class ThreadA extends Thread{
		@Override
		public void run(){
			super.run();
			for(int i=0;i<100;i++){
				list.add(i);
			}
		}
	}
	class ThreadB extends Thread{
		@Override
		public void run(){
			super.run();
			for(int i=0;i<100;i++){
				list.add(i);
			}
		}
	}
}

在list是Linkedlist的时候,无论怎么运行结果都不会是200,单如果要是用Vector实例出来的list结果总会是200.

时间: 2024-08-04 22:49:27

线程安全不安全的辅助理解,可以拿这个例子自己去运行看看的相关文章

小猪的数据结构辅助教程——2.5 经典例子:约瑟夫问题的解决

小猪的数据结构辅助教程--2.5 经典例子:约瑟夫问题的解决 标签(空格分隔): 数据结构 约瑟夫问题的解析 关于问题的故事背景就不提了,我们直接说这个问题的内容吧: 一堆人,围成一个圈,然后规定一个数N,然后依次报数,当报数到N,这个人自杀,其他人鼓掌!啪啪啪, 接着又从1开始报数,报到N又自杀-以此类推,直到死剩最后一个人,那么游戏结束! 这就是问题,而我们用计算机模拟的话,用户输入:N(参与人数),M(第几个人死),结果返回最后一个人! 类似的问题有跳海问题,猴子选王等,下面我们就以N =

小猪的数据结构辅助教程——2.6 经典例子:魔术师发牌问题和拉丁方阵问题

小猪的数据结构辅助教程--2.6 经典例子:魔术师发牌问题和拉丁方阵问题 标签(空格分隔): 数据结构 本节引言: 本节继续带来的是循环链表的两个经典例子,分别是魔术师发牌问题和拉丁方阵问题! 1.魔术师发牌问题 问题描述: 魔术师利用一副牌中的13张黑桃牌,预先将他们排好后叠放在一起,牌面朝下.对观众说:"我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示."魔术师将牌堆最上面的哪张排数为1,把他翻过来正好是黑桃A,将黑桃A从牌堆抽出放在桌子上,第二次数1.2

iOS开发 - 线程与进程的认识与理解

进程: 进程是指在系统中正在运行的一个应用程序,比如同时打开微信和Xcode,系统会分别启动2个进程; 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内; 线程: 一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程),是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位; 一个进程(程序)的所有任务都在线程中执行; 一个程序有且只有一个主线程,程序启动时创建(调用main来启动),主线程的生命周期是和应用程序绑定,程序退出时,主线程也停止;

关于进程与线程的讲解 最最最生动的理解

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握.我发现有一个很好的类比,可以把它们解释地清晰易懂. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工.背后的含义就是,单个CPU一次只能运行一个任务. 进程就好比工厂的车间,它代表CPU所能处理的单个任务.任一时刻,CPU总是运行一个进程,其他进程处于非运行状态. 一个车间里,可以

线程与进程(我的理解)

最近面试有人问到线程与进程的区别,我就说进程是系统资源分配的最小单位,线程是CPU调度的最小单位.但是人家有细问了一下,我就没回答出来, 后来我查查书,没有查到我满意的解释.感觉应该是这样的(以后有新的理解会补充进来,如果有错也会改正O(∩_∩)O~) 最开始没有线程,只有进程,比如写个程序,程序运行起来以后,进程就是程序运行的实例,pid就是进程的标识. 后来有了多处理器啥的,一些程序为了用上这多个CPU,让这些程序共享系统资源等,但每个程序又有自己的一些属性,这些程序就称之为线程.如果这些程

进程与线程、并行与并发的理解

进程与线程 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执

记录一次线程池的在项目中的实际应用,讲解一下线程池的配置和参数理解。

前言:最近项目中与融360项目中接口对接,有反馈接口(也就是我们接收到请求,需要立即响应,并且还要有一个接口推送给他们其他计算结果),推送过程耗时.或者说两个接口不能是同时返回,有先后顺序. 这时我想到了把自己Controller立即返回接受成功,中间添加一个新的线程去做其他耗时的操作(线程池配置和参数测试讲解请阅读第5步). 1.Controller代码如下: @Autowiredprivate CallThreadDemo worker; @RequestMapping("/bandBank

java的线程同步机制synchronized关键字的理解

线程同步:               由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: 1)synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.如果 再细的分类,synchronized可作用于instance变量.object reference(对象引用).static函数和clas

线程、进程、携程理解

并发与并行 并发 拥有处理多个任务的能力.对于单核CPU来说,只能处理并发 并行 拥有同时处理多个任务的能力,对于多核CPU,即可以并发和并行 同步与异步 同步和异步强调的是消息通信机制 同步 如果一个人这样处理:先烧水,烧水的过程中啥也不干,就一直等着,等水开后,再把茶叶放到开水壶中.这种处理方法就是同步处理 也就是说,一个任务需要多步执行,如果上一步没有执行结束,那么下一步任务就一直等待.等到上一步任务完成后(一般会有结果),下一步的任务才继续执行 在计算机中:如果一段代码A的执行中需要调用