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(线程不安全)的更多相关文章

  1. java 线程安全不线程不安全

    经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vec ...

  2. Windows线程漫谈界面线程和工作者线程

    每个系统都有线程,而线程的最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应力. 线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列” ...

  3. ReentrantLock+线程池+同步+线程锁

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  4. 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全

    关于线程和线程不安全: 概述 编辑 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就 ...

  5. 0039 Java学习笔记-多线程-线程控制、线程组

    join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...

  6. C#夯实基础之多线程二:主线程、前台线程与后台线程

    我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...

  7. Java用户线程和守护线程

    今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...

  8. IOS 线程处理 子线程

    IOS 线程处理 子线程的启动与结束 技术交流新QQ群:414971585   IOS中,如果要在主线程中启动一个子线程,可以又两种方法: [NSThread detachNewThreadSelec ...

  9. C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)

           我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...

  10. java线程内存模型,线程、工作内存、主内存

    转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...

随机推荐

  1. PD name 和 comment 互换

    1 PowerDesigner中批量根据对象的name生成comment的脚本 执行方法:Open PDM -- Tools -- Execute Commands -- Run Script --- ...

  2. 11个好用的jQuery拖拽拖放插件

    这次我们整理一些拖拽播放类型的jQuery插件,这些可能不是很常用,但偶尔会有网站设计项目用到,特别是后台相关的开发项目,这个拖放排序功能一般都会有,所以适合大家收藏起来,方便日后使用.接下来一起看盾 ...

  3. bzoj 1222: [HNOI2001]产品加工 dp

    1222: [HNOI2001]产品加工 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 381  Solved: 218[Submit][Status ...

  4. 破解之寻找OEP[手动脱壳](2)

    1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:“在数据窗口中跟随”,到内存数据窗口,将内存数据窗口以HEX 数据形式显示,在刚才的地址起始位置上(如 ...

  5. 2026-Keroro侵略地球

    描述 Keroro来侵略地球之前,曾跟Giroro伍长打赌:“我一个人灭掉整个地球给你看!”. 于是Keroro同学真的自己一个人来到地球开始他的侵略行动了.从K隆星出发之前,Keroro从Kurur ...

  6. ***用php的strpos() 函数判断字符串中是否包含某字符串的方法

    判断某字符串中是否包含某字符串的方法 if(strpos('www.idc-gz.com','idc-gz') !== false){ echo '包含'; }else{ echo '不包含'; } ...

  7. HDU1565+状态压缩dp

    简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...

  8. android dialog点击其他区域消失

    只需调用dialog对象的setCanceledOnTouchOutside方法,传入参数为true即可. 如下代码实现: //点击其他区域dialog消失 menuDialog.setCancele ...

  9. Java知识大全

    http://blog.csdn.net/zhangerqing/article/details/8245560

  10. socket编程中write、read和send、recv之间的区别

    http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用. 由此网络 ...