文章:ThreadStatic特性

地址:https://www.cnblogs.com/xuejietong/p/10997385.html

带有threadStaticAttribute标记的静态字段在线程之间不共享。每个执行线程都有一个单独的字段实例,并独立地设置和获取该字段的值。

如果在不同的线程上访问该字段,则它将包含不同的值。除了将threadStaticAttribute属性应用于字段之外,还必须将其定义为静态字段(在C中)或共享字段(在Visual Basic中)。不要为标记为threadStaticAttribute的字段指定初始值,因为此类初始化仅在类构造函数执行时发生一次(静态构造函数),因此只影响一个线程。

研究农业银行的支付接口demo时,发现代码中使用了这个特性:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text; namespace com.abc.trustpay.client
{
public class JSON
{
[ThreadStatic]
private static string iJsonString = ""; public static void setJsonString(string aJsonString)
{
JSON.iJsonString = aJsonString.Trim();
} public static string WriteDictionary(IDictionary dic)
{
StringBuilder stringBuilder = new StringBuilder("");
bool flag = false;
stringBuilder.Append("{");
foreach (DictionaryEntry dictionaryEntry in dic)
{
if (flag)
{
stringBuilder.Append(",");
}
stringBuilder.Append("\"");
stringBuilder.Append(dictionaryEntry.Key);
stringBuilder.Append("\":");
stringBuilder.Append("\"");
stringBuilder.Append(dictionaryEntry.Value);
stringBuilder.Append("\"");
flag = true;
}
return stringBuilder.ToString();
} public static string WriteDictionarys(IDictionary dic)
{
StringBuilder stringBuilder = new StringBuilder("");
bool flag = false;
stringBuilder.Append("[");
foreach (int num in dic.Keys)
{
if (flag)
{
stringBuilder.Append("},");
}
string value = JSON.WriteDictionary((IDictionary)dic[num]);
stringBuilder.Append(value);
flag = true;
}
stringBuilder.Append("}]");
return stringBuilder.ToString();
} public static string GetKeyValue(string aTag)
{
string text = JSON.iJsonString;
int num = text.IndexOf(aTag);
string result;
if (num == -1)
{
result = "";
}
else
{
while (!text.Substring(num - 1, 1).Equals("\"") || !text.Substring(num + aTag.Length, 1).Equals("\""))
{
num = text.IndexOf(aTag, num + 1);
if (num == -1)
{
result = "";
return result;
}
}
int length = aTag.Length;
num = num + length + 2;
string text2 = "";
char c = text[num];
if (c == '{')
{
text2 = JSON.GetObjectValue(num, aTag, text);
}
if (c == '"')
{
text2 = JSON.GetStringValue(num, aTag, text);
}
result = text2;
}
return result;
} private static string GetObjectValue(int index, string aTag, string json)
{
int num = 0;
StringBuilder stringBuilder = new StringBuilder();
char c;
while (true)
{
c = json[index];
if (c == '{')
{
num++;
}
if (c == '}')
{
num--;
}
if (num == 0)
{
break;
}
stringBuilder.Append(c);
index++;
}
stringBuilder.Append(c);
return stringBuilder.ToString();
} private static string GetStringValue(int index, string aTag, string json)
{
StringBuilder stringBuilder = new StringBuilder();
index++;
while (true)
{
char c = json[index++];
if (c == '"')
{
break;
}
stringBuilder.Append(c);
}
return stringBuilder.ToString();
} public static Dictionary<int, Hashtable> GetArrayValue(string aTag)
{
string text = JSON.iJsonString;
Dictionary<int, Hashtable> dictionary = new Dictionary<int, Hashtable>();
Hashtable hashtable = new Hashtable();
StringBuilder stringBuilder = new StringBuilder();
int num = text.IndexOf(aTag);
Dictionary<int, Hashtable> result;
if (num == -1)
{
result = dictionary;
}
else
{
int length = aTag.Length;
num = num + length + 2;
int num2 = 0;
while (true)
{
char c = text[num++];
if (c != '[')
{
if (c != ']')
{
stringBuilder.Append(c);
}
if (c == '}')
{
c = text[num++];
hashtable.Add(num2, stringBuilder);
num2++;
stringBuilder = new StringBuilder();
}
if (c == ']')
{
break;
}
}
}
if (hashtable.Count == 0)
{
result = dictionary;
}
else
{
dictionary = JSON.ParseArray(hashtable);
result = dictionary;
}
}
return result;
} public static Dictionary<int, Hashtable> ParseArray(Hashtable hts)
{
Dictionary<int, Hashtable> dictionary = new Dictionary<int, Hashtable>();
Hashtable value = new Hashtable();
foreach (int num in hts.Keys)
{
string json = hts[num].ToString();
value = JSON.ParseString(json);
dictionary.Add(num, value);
value = new Hashtable();
}
return dictionary;
} public static Hashtable ParseString(string json)
{
StringBuilder stringBuilder = new StringBuilder();
Hashtable hashtable = new Hashtable();
int num = json.IndexOf("{");
int length = json.Length;
json = json.Substring(num + 1, length - 2);
json = json.Replace("\"", "");
string[] array = json.Split(new char[]
{
','
});
string[] array2 = new string[2];
for (int i = 0; i < array.Length; i++)
{
array2 = array[i].Split(new char[]
{
':'
});
hashtable.Add(array2[0], array2[1]);
}
return hashtable;
}
}
}

ThreadStatic特性的更多相关文章

  1. AsyncLocal 与 ThreadLocal ThreadStatic特性简介

    AsyncLocal 与 ThreadLocal [.NET深呼吸]基于异步上下文的本地变量(AsyncLocal) https://www.cnblogs.com/tcjiaan/p/5007737 ...

  2. ThreadStatic应用(Identity补完)

    关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重复标识字符串;(这里说的相对是指一定的数量下不重复) 灵感 ...

  3. 基础才是重中之重~关于ThreadStatic和Quartz的一点渊源

    回到目录 ThreadStatic ThreadStatic是C#里的一个特性,它可以让你的字段在一个线程里有效,但你不能控制这个字段在何时被回收,即如果声明一个int32的字段为ThreadStat ...

  4. 被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?

    一:背景 1. 讲故事 前几天公号里有一位朋友留言说,你windbg玩的溜,能帮我分析下被 ThreadStatic 修饰的变量到底存放在哪里吗?能不能帮我挖出来,其实这个问题问的挺深的,玩高级语言的 ...

  5. 【C# 线程】线程局部存储(TLS)理论部分 ThreadStatic|LocalDataStoreSlot|ThreadLocal<T>

    线程本地存储(TLS:Thread Local Storage) 线程本地存储(Thread Local Storage),字面意思就是专属某个线程的存储空间.变量大体上分为全局变量和局部变量,一个进 ...

  6. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  7. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  8. .Net面試題

    初级.NET开发人员 - 任何使用.NET的人都应知道的 1. 描述线程与进程的区别? 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在.进程可以定义程序的 ...

  9. 多线程中Local Store Slot(本地存储槽)

    在Java中有一种ThreadLocal机制,为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线程的角度看,就好像每一个线程都完全 ...

随机推荐

  1. 关于Excel 2016 总要点击两次才能打开的解决方法

    1.快捷键:win+r,输入:regedit2.定位到如下项目“HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command”:3.编辑原有的内容,在最后添加 ...

  2. Javaspring+mybit+maven中实现Junit测试类

    在一个Javaspring+mybit+maven框架中,增加Junit测试类. 在测试类中遇到的一些问题,利用spring 框架时,里面已经有保密security+JWT设定的场合,在你的secur ...

  3. Kafka压测— 搞垮kafka的方法(转)

    分布式系统故障场景梳理方法: 场景梳理逻辑关系: 单点硬件故障→单点进程故障类型→集群影响→集群故障场景 第三方依赖故障→集群依赖关系→集群影响→集群故障场景 业务场景→集群负载/错误影响→集群故障场 ...

  4. Java中遍历Map对象的4种方法

    java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等). HashMap<Inte ...

  5. 数列分段 II

    题目描述 思路 代码 #include <cstdio> int n, m, arr[100005], ans; int l, r, mid, inf = 0x7f3f3f3f; inli ...

  6. jvm堆内存模型原理分析及堆内存分析工具jhat和MAT的使用超详细教程

  7. 组件系列之RabbitMQ

    官网: https://www.rabbitmq.com/getstarted.html 1.四种交换机 TODO... 2.消费者获取消息方式:推 和 拉 拉取:每次拉取一条,循环拉取需要的条数在批 ...

  8. 作业调度框架Quartz.NET-现学现用-02-任务监听

    原文:作业调度框架Quartz.NET-现学现用-02-任务监听 前言 任务调度系统并不是完美的,它会出现任务执行失败的情况.如果你需要处理任务失败后的逻辑,希望这篇笔记可以为你提供些帮助. Quar ...

  9. C语言中特殊字符含义

    字符 中文 英文 说明  \n  换行符  newline     \t      Tab键  \b    backspace  退格键                        

  10. 一个 Vim 重度用户总结的 vim 超全指南

    我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 Vim 的朋友来说,可能还无法体会到这种感觉.由于使用 ...