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};就对了。这样就是绝对线程安全。

时间: 2024-10-17 06:39:32

vector(相对线程安全) arryList(线程不安全)的相关文章

线程安全和线程不安全理解

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 ================================================================= 概念: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果

java 线程安全不线程不安全

经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vector来举个例子: 这里的arraylist 是线程不安全的,Vector是线程安全的 package Thread; import java.util.List; import java.util.concurrent.CountDownLatch; public class MyThread i

线程安全和线程不安全

ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题.面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的.因为这是昨晚刚背的<Java面试题大全>上面写的.此时如果继续问:什么是线程安全

转载 线程安全和线程不安全理解

本文章为转载文章,如有侵权,请联系我. 转载出处:http://blog.csdn.net/ghevinn/article/details/37764791 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 =======================================

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

每个系统都有线程,而线程的最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应力. 线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列”,“消息队列”也是界面线程和工作者线程的最大区别,这个词应该进到你的脑子里,根深蒂固的! 如果在界面线程的某个地方停住,这说明它处理不了窗口消息了,所以有时候我们就会看到整个界面无响应了.这种问题后面会提供一个叫 WaitForObjectEx 的函数来解决,我们后面再谈. 线程首先就是它的创建,创

Unix C++(boost) 线程同步和线程组

#include <boost/thread.hpp> #include <iostream> #include <vector> #include <cstdlib> #include <ctime> boost::mutex mutex; boost::condition_variable_any cond; std::vector<int> random_numbers; void fill() { std::srand(sta

C++11线程指南(五)--线程的移动语义实现

1. 线程的移动语义实现 基于前面几章介绍的移动语义,我们用它来实现线程. #include <iostream> #include <thread> #include <vector> #include <algorithm> #include <cassert> int main() { std::vector<std::thread> workers; for (int i = 0; i < 5; i++) { auto

线程类与线程池

一.线程类 >>函数 1.创建线程 void startThread(bool bSuspend = false) 2.停止线程 virtual void endThread() = 0 3.挂起线程 void suspendThread() 4.恢复线程 void resumeThread() 5.获取线程句柄 inline HANDLE GetHandle(){return m_hThread;} 6.线程的入口函数 static unsigned int __stdcall m_fnTh

线程安全和线程同步的理解

线程安全:线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况. 理解:多个线程对同一个是数据进行写操作的时候,执行的结果和预期结果是一致的,就表示线程安全.(如购票系统) 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临

Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性.因此,为避免线程安全问题,应该避免多线程环境下对此共享资源的并发访问. 线程安全问题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的:当多个线程都执行写操作时,需要考虑线程同步来解决线程安全问题. 二.线程同步(synchr