vector(相对线程安全) arryList(线程不安全)
1.什么是线程安全?
如果说某个集合是线程安全的,那么我们就不用考虑并发访问这个集合?(需要定义自己百度,但是很难懂)
2.深入jvm中的线程安全的级别。
a不变模式(String等基本类型)
b、绝对线程安全(无论咋样处理都安全,把各种方法各种组合使用也安全。)
c.相对线程安全(就是那些集合了,都是每个同步方法单独是安全的)
3.来点实惠的例子(arraylist线程不安全)
package 线程安全的讨论; import java.util.ArrayList; class MyThread implements Runnable
{
private ArrayList<Integer> arry=null;
public MyThread (ArrayList<Integer> arry)
{
this.arry=arry;
} @Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
arry.add(10);
}
System.out.println(arry.size()); } } public class ArrayListTest { public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> arry=new ArrayList<Integer>();
for(int i=0;i<100;i++)
{
new Thread(new MyThread(arry)).start();
} } }
很简单的逻辑,共100个线程,每个添加10个数,最后那个size应该是多少呢?1000,恭喜你,都学会算数了,你自己执行以下看看。
把大象添加到冰箱共需要多少步?
arry.add()需要两步。1.放到尾巴2,size+1 两个线程读到相同的尾巴呢,一个丢失就更新了(跟数据库中的丢失更新是一样一样的);
2.vector不是绝对安全的
package 线程安全的讨论; import java.util.Vector;
class A implements Runnable
{
private Vector<Integer> a=null;
public A(Vector<Integer> a)
{
this.a=a;
} @Override
public void run() {
// TODO Auto-generated method stub
int count=0;
while(count<10)
{
a.add(10);
try {
Thread.sleep((long) (3000*Math.random()));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(a.size()); count++;
} } } public class VectorTest { public static void main(String[] args) {
// TODO Auto-generated method stub
Vector<Integer> vec=new Vector<Integer>();
for(int i=0;i<2;i++)
{
new Thread(new A(vec)).start();; } } }
运行之后会有相同的大小,为啥呢?size和add都是线程安全,但是两者合起来就不是线程安全的,如果加synchornized{add,size};就对了。这样就是绝对线程安全。
vector(相对线程安全) arryList(线程不安全)的更多相关文章
- java 线程安全不线程不安全
经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vec ...
- Windows线程漫谈界面线程和工作者线程
每个系统都有线程,而线程的最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应力. 线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列” ...
- ReentrantLock+线程池+同步+线程锁
1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...
- 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全
关于线程和线程不安全: 概述 编辑 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就 ...
- 0039 Java学习笔记-多线程-线程控制、线程组
join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...
- C#夯实基础之多线程二:主线程、前台线程与后台线程
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...
- Java用户线程和守护线程
今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...
- IOS 线程处理 子线程
IOS 线程处理 子线程的启动与结束 技术交流新QQ群:414971585 IOS中,如果要在主线程中启动一个子线程,可以又两种方法: [NSThread detachNewThreadSelec ...
- C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)
我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
随机推荐
- 浅谈Javascript 数组与字典
Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法. var a = new Array(); a[0] = "Acer&q ...
- 【概率】poj 2096:Collecting Bugs
Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...
- MVC EF异常-“序列化类型为 XX 的对象时检测到循环引用”
原因:在EF实体中,两个互为主外键关系的实体类的导航属性相互引用. 解决方法一:删除一个不需要的类的导航属性 方法二:使用DTO模型 方法三:直接返回需要的属性(不能包括相互引用的属性)
- VS2008调试技巧收集备用
VS2005调试技巧集合 http://blog.csdn.net/rainylin/archive/2007/09/06/1775125.aspx 下面有从浅入深的6个问题,您可以尝试回答一下 一个 ...
- 在线学习SQL语句?没问题~~
以前弄得少,没注意.. http://sqlfiddle.com/ CREATE TABLE Presidents ( Id INT UNSIGNED NOT NULL AUTO_INCREMENT, ...
- 如何:在 Winform 动态启动、控制台命令行?
需求 winForm 程序输出类型为 windows 程序(不是命令行程序) 在运行时想输入一些信息编译开发调试,如何实现这一功能 解答: AllocConsole.FreeConsole ...
- 安装TokuDB引擎
前言:TokuDB 是一个高性能.支持事务处理的 MySQL 和 MariaDB 的存储引擎.TokuDB 的主要特点是高压缩比,高 INSERT 性能,支持大多数在线修改索引.添加字段,非常适合日志 ...
- [转] Android自动化测试之MonkeyRunner录制和回放脚本(四)
测试脚本录制: 方案一: 我们先看看以下monkeyrecoder.py脚本: #Usage: monkeyrunner recorder.py #recorder.py http://mirror ...
- [转] android自动化测试之MonkeyRunner使用实例(三)
一.使用CMD命令打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器或连上设备,不然monkeyrunner无法连接设备. 1.1 用Elipse打开Android模拟器或在CMD中 ...
- 如何在 OS X Yosemite 中安装 Java
如果你的 Mac 纯净的安装了 OS X Yosemite 的话,其中是不会包含 Java 的,如果你的 Mac 需要安装 Java 环境的话,可以通过下面介绍的两种方法来实现.通过手动安装最新版 J ...