电玩城打鱼捕鱼-专业24小时上下分

STL中map的问题

十二月 21st, 2019  |  电玩城捕鱼系统简介

定义一个map,关键字是线程ID,键值是vector,保存每个线程特有的一些属性。编写代码,每个线程对各自的键值进行修改。就相当于多个线程同时对一个map数据修改,会不会出现内存冲突的情况,有什么隐含的问题?最后一点分,都压上了,求给力~

  3)Vector:  底层是数组,查询快,增删慢,线程安全,效率低。//一般不使用Vector,而是使用Collections.synchronizedList(new ArrayList<E>());
来转成线程安全

电玩城打鱼捕鱼,2)为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;

  1)ArrayList: 底层是数组,查询快,增删慢,线程不安全,效率高;

  可以看到ThreadLocalMap的Entry继承了WeakReference,并且使用ThreadLocal作为键值。然后再继续看setInitialValue方法的具体实现:

    while(iterator.hasnext()){

 
如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法。

1、数组与集合的区别:

 

  2)LinkedList: 底层是链表,查询慢,增删块,线程不安全,效率高;

 

  2)HashMap线程不安全,效率高,而HashTable线程安全,效率低。

  如果map不为空,就设置键值对,为空,再创建Map,看一下createMap的实现:

  PS:本人为新人,所以见解不是很全面,希望广大朋友积极提出建议。

  电玩城打鱼捕鱼 1

          1)首先找到所有的key,遍历key,根据key找value。用到keyset()方法。

ThreadLocal设置默认值,避免第一次获取值为null:

1 /**
2  *    设置ThreadLocal中第一次默认值
3  */
4 public class ThreadLocalExt extends ThreadLocal<String> {
5     @Override
6     protected String initialValue() {
7         return "我是ThreadLocal的默认值";
8     }
9 }

 1 public class Run {
 2 
 3     public static ThreadLocalExt t1 = new ThreadLocalExt();
 4     /**
 5      *    测试设置ThreadLocal默认值
 6      */
 7     public static void main(String[] args) {
 8         
 9         if(t1.get() == null) {
10             System.out.println("未设置值");
11             t1.set("我的值");
12         }
13         System.out.println(t1.get());
14         System.out.println(t1.get());
15     }
16 }

运行结果如下:

  电玩城打鱼捕鱼 2

  2)数组的所有元素都是同一类型,而集合可以存储不同类型的元素;

  电玩城打鱼捕鱼 3

    }

  首先看一下getMap方法中做了什么:

      //注意:此处只能读取,不能修改;若要修改,使用普通for循环

  电玩城打鱼捕鱼 4

 

1)实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的;

  3)数组可以存储值类型与引用类型,但是集合只能存储引用类型。

再次测试线程变量的隔离性:

 1 import java.util.Date;
 2 
 3 /**
 4  *    工具类,定义公共的静态的ThreadLocal对象
 5  */
 6 public class Tools {
 7     
 8     public static ThreadLocal<Date> t1 = new ThreadLocal<>();
 9 
10 }

 1 import java.util.Date;
 2 
 3 /**
 4  *    线程A,当前线程运行时会先判断是否设置过值,如果没有设置,则设置一个值
 5  *    如果设置过了,则直接获取值
 6  */
 7 public class ThreadA extends Thread {
 8     @Override
 9     public void run() {
10         try {
11             for (int i = 0; i < 20; i++) {
12                 if(Tools.t1.get() == null) {
13                     Tools.t1.set(new Date());
14                 }
15                 System.out.println("ThreadA get Value = " + Tools.t1.get().getTime());
16                 Thread.sleep(200);
17             }
18         } catch (InterruptedException e) {
19             e.printStackTrace();
20         }
21     }
22 }

 1 import java.util.Date;
 2 
 3 /**
 4  *    线程B,当前线程运行时会先判断是否设置过值,如果没有设置,则设置一个值
 5  *    如果设置过了,则直接获取值
 6  */
 7 public class ThreadB extends Thread {
 8     @Override
 9     public void run() {
10         try {
11             for (int i = 0; i < 20; i++) {
12                 if(Tools.t1.get() == null) {
13                     Tools.t1.set(new Date());
14                 }
15                 System.out.println("ThreadB get Value = " + Tools.t1.get().getTime());
16                 Thread.sleep(200);
17             }
18         } catch (InterruptedException e) {
19             e.printStackTrace();
20         }
21     }
22 }

 1 public class Run {
 2     /**
 3      *    再次测试线程变量的隔离性,每个线程获取的值都为自己设置的值
 4      */
 5     public static void main(String[] args) {
 6         try {
 7             ThreadA a = new ThreadA();
 8             a.start();
 9             Thread.sleep(1000);
10             ThreadB b = new ThreadB();
11             b.start();
12         } catch (InterruptedException e) {
13             e.printStackTrace();
14         }
15     }
16 }
标签:, , , , , ,

Your Comments

近期评论

    功能


    网站地图xml地图