值类型变量,如何保证线程安全?

问题描述

如题!就是如何保证几个线程访问并修改一个全局值类型变量不发生冲突。

解决方案

解决方案二:
本帖最后由 bdmh 于 2014-08-26 14:07:03 编辑
解决方案三:
单个值类型变量本来就是原子操作,线程安全
解决方案四:
用lock对变量读写加锁,而lock其实就是monitor的语法糖。对于简单变量,用Interlocked可以实现相同的作用,并且提高性能,因为它基于操作系统和硬件的实现。
解决方案五:
除了简单类型,值类型的访问并非是原子操作,比如:structAddress{publicstringCountry{get;set;}publicstringCity{get;set;}}这里就要考虑对象状态的原子性问题了,如果我们要更改一个地址,而只更改了国家,没有更改城市,那么此时对象的状态是不正确的。当然,我们最好把它设计成构造函数一次性赋值,而属性只读的,从设计上保持它的原子性。比如DateTime,你就不能更改它的属性,而通过AddHoursAddDays都会返回一个新的对象。
解决方案六:
他问的是一个全局值类型对象,应该就是指简单对象吧而你的例子已经不能算一个对象了吧,这是多个对象封装成结构体了...
解决方案七:
引用2楼Z65443344的回复:

单个值类型变量本来就是原子操作,线程安全

longl;l=123456789;//32位机器上不安全,因为需要分开写高32位和低32位inti;i++;//不安全,因为有多个操作,读出,加一,写入structA{publicintI1;publicintI2;publicintI3;}Aa=b;//结构(值类型)不安全,同样因为需要多个操作。

解决方案八:
学习了...

时间: 2024-12-04 20:22:04

值类型变量,如何保证线程安全?的相关文章

银行取款[多线程]{使用volatile修饰共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用volatile修饰共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: 我学习地址(Thanks for auther): Java 理论与实践: 正确使用 Volatile 变量 java中volatile关键字的含义 ----------------------------------------------------------

jvm-哪位大神解释下[volatile不能保证原子性,也就不能保证线程安全]这句话

问题描述 哪位大神解释下[volatile不能保证原子性,也就不能保证线程安全]这句话 哪位大神解释下[volatile不能保证原子性,也就不能保证线程安全]这句话 哪位大神解释下[volatile不能保证原子性,也就不能保证线程安全]这句话 哪位大神解释下[volatile不能保证原子性,也就不能保证线程安全]这句话 解决方案 简单来说,volatile在多cpu环境下不能保证其它cpu的缓存同步刷新,因此无法保证原子性. 解决方案二: 还是以最常用的i++来说吧,包含3个步骤 1,从内存读取

银行取款[多线程]{使用ThreadLocal管理共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用ThreadLocal管理共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: ----------------------------------------------------------------------------------------------------------------------------------

写了一个混合36进制&26进制算法,若要运行在多线程环境下,怎样保证线程安全和性能?

问题描述 packagealgorithm;/***混合进制计数类*其中最高位(仅一位)为26进制(英文字母表示),除最高位外(共N-1位)用36进制([0~9-A-Z])来表示*/publicclassMixBaseCounter{privatestaticfinalStringBufferbase26=newStringBuffer("ABCDEFGHIJKLMNOPQRSTUVWXYZ");privatestaticStringBuffermixBaseStr=newString

线程同步傻问题:该被同步的变量没有用信号量控制,值是否会被改变

 线程同步傻问题:该被同步的变量没有用信号量控制,值是否会被改变 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 7 namespace testLockList 8 { 9 class Program 10 { 11 12 const int ThreadMaxNum = 5; //要启动的线程的最大

java多线程总结一:线程的两种创建方式及优劣比较

http://blog.csdn.net/touch_2011/article/details/6891026 1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现类的对象. (3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象.(接口可以实现多继承) (4).调用Thread对象的start()方法,启动线程 示例代码

main-java 子线程结束结束 内部子线程也结束 具体看代码注释

问题描述 java 子线程结束结束 内部子线程也结束 具体看代码注释 import java.util.ArrayList; import org.junit.Test; /** 代码很简单的 就是起了一个线程 然后在一个list里面放了1000个数字 然后打印以下 但是test方法 用junit起的 不能完全打印 而main可以 最终是想要使得这个test方法能和main的效果一样 * */ public class TestSub { @Test public void test() { /

值类型与引用类型(中)

本文将介绍以下内容: 类型的基本概念  值类型深入 引用类型深入 值类型与引用类型的比较及应用    1. 引言 上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的发布,受到大家的不少关注,我们从内存的角度了解了值类型和引用类型的所以然,留下的任务当然是如何应用类型的不同特点在系统设计.性能优化等方面发挥其作用.因此,本回是对上回有力的补充,同时应朋友的希望,我们尽力从内存调试的角度来着眼一些设计的分析,这样就有助于对这一主题进行透彻和全面的理解,当然这也是下一回的重点. 从内存角

C# 引用类型、值类型

CLR支持两种类型:引用类型和值类型,它们的区别是在内存分配方式上的差异:引用类型是从托管堆上分配的:值类型是在线程栈上分配的.而CLR的垃圾回收是针对托管堆的,因此值类型不受垃圾回收器的控制. 在FCL中,所有称为"结构"(struct)的类型都是值类型,所有称为"类"(class)的类型都是引用类型.所有的Struct都直接派生自抽象类System.ValueType,而System.ValueType直接从System.Object派生.所有的枚举都直接从Sy