Java两个线程操作一个变量,为什么变量的值会不一样呢

作者&投稿:蔚路 (若有异议请与网页底部的电邮联系)
java中如果不加同步锁,多个线程对同一个变量修改,为什么会出现混乱~

因为线程的完成时间问题,有可能线程A先完成,将变量S赋值为s了,然后线程B再完成,将S赋值为s1,那么S的值就为s1;但是,有可能线程B先完成,将S赋值为s1,然后线程A再完成,给S赋值s,那么S的值就是s了。

这个变量如果是静态的,那内存中就只有一个变量;如果这个变量不是静态的,那就是每个线程中存在这一个变量(取决于线程数目),此时这个变量在内存中会开开一个新的存储空间

这是JAVA线程中的并发安全性问题,比方说,有一个筐,有一个人不停往筐里放苹果,当放到第10个的时候,你自然认为筐里有10个苹果。但是你不知道的是另外有一个人趁你不注意的时候偷偷向外拿苹果,结果你认为是10个,结果一数只有4个,另外6个你不知道到哪里去了。这意味着你发生了线程安全问题。根据不同的项目类型,如C/S Application或者B/S WEB,有多种控制线程安全性的方法。最直观的是使用“锁”,即第一个人把筐子抱过去放苹果,没放完就不让别人拿。这时候即为“筐”加了一把锁,也不会发生线程安全性问题了。但是如果没有控制好便随之带来其他的问题。比方说这个人放完了10个苹果,本来应该把筐让出去,但是他抱着不放,别人就无法拿到苹果了。这叫做死锁。线程的问题想要说得明白,建议你还是看一看“多线程”、“锁”相关的文档、资料和实例。

如楼下所说,线程同步的问题。
除了了使用synchronized。

还可以使用原子类型,例如AtomicInteger,参见

http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/index.html

线程同步。
具体的你可以在每次使用num的地方将num的值输出看看,就会发现问题。
synchronized(this){
static int num = 25;

}

线程的执行顺序是未知的,这是由JVM的调度程序来决定的。在多线程共同使用一个相同的变量时,若没有同步就会产生数据不一致的情况。所以,最好使用同步,即synchronized关键字。


ava中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop...
线程的实现方法就是两种了,一种是继承Thread类一种是实现Runnable接口同步方法当然是用同步Synchronized修饰了stop和suspend太粗暴了,不问青红皂白就把线程干掉了,很不讲理很不安全的,当然不推荐使用 本回答被网友采纳 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...

使用多线程应注意些什么?
<1>.不要调用Thread类或Runnable对象的run方法。直接调用run方法只会执行同一个线程中的任务,而不会启动新的线程。应该调用Thread.start方法。这个方法将创建一个执行run方法的新线程。<2>.interrupted和isInterrupted是两个非常相似的方法。interrupted方法是一个静态的方法。它检测当前的线程是否被中断。...

JAVA中的多线程能在多CPU上并行执行吗?注意,我说的不是并发执行哦_百度...
你的思路是对的,CPU就是为了迎合操作系统的多线程从而提高系统的计算效率.但是具体分配任务到各个内核中去执行的并非JAVA与JVM而是操作系统.也就是说,你所执行的多线程,可能会被分配到同一个CPU内核中运行.也可能非配到不同的cpu中运行.如果可以控制CPU的分配,那也应该是操作系统的api才能实现的了 ...

多线程软件
单:用vb写的程序都是单线程的,植物大战僵尸,nod32,江民,vb6,vc6,quick basic,virtual pc 双线程的:ava,csol,winrar,winzip,autocad,delphi 四:ie,vsiual studio 2005,八:3DMark,pcmark 四线程和八线程的软件都不多,一般双线程就够速度的了,所以四线程以上的软件没几个 ...

玩战地之王(AVA)时,CPU使用率100%
所有的流输入\/输出操作例如使用Windows Media Player 听音乐将有可能是音乐失真成因:当你在资源管理器里面右键点击一个文件或目录的时候,当快捷 菜单显示 的时候,CPU占用率将增加到100%,当你关闭快捷菜单的时候才返回正常水平。解决方法:方法一:关闭“为菜单和工具提示使用过渡效果”1、点击“开始”--“控制面板”2...

我家ava一会卡一会不卡 怎么回事啊 以前不是这样的fps现在才80到100C...
我家也是这样,我也玩的是那个区,应该是AVA目前服务起不稳定引起的!在网吧有时都卡。建议你当房主,可能没那么卡!

我重新装了一次显卡驱动后,AVA就进不去了.重装几次都不可以.大哥帮帮我...
三重缓冲:关 各项异性过滤:4x 垂直同步:关 多显示器:单一。平滑灰度:关 平滑处理设置:4x 平滑透明度:关 强制MIPMAPS:双线性 扩展:关 最大预渲染帧速:0 纹理过滤 MIP过滤器优化:关 纹理过滤:采样优化:开 纹理过滤:质量 纹理过滤:三线优化:关 线程优化:自动 如果有些没有的就不用设置...

我的电脑要换什么才能玩AVA
你要整体换平台,才能玩舒服AVA 1、你的U是单核的3.0,后面的(2CPUS)是指HT超线程技术,那个真双核差的一帽子远 2、内存你是1G的DDR的,属于比较老的内存了 3、你的显卡9600,已经是04-05年时候的显卡了,已经换了很多代了,而且关键的是,这个卡是AGP的卡,意味着你的主板的显卡插槽也是...

ava的大方向是什么
第一个阶段(java基础阶段)1.java语法2.面向对象3.常用的api4.界面编程5.多线程6.文件io7.java网络编程.看看远标老师的java视频 第二个阶段(数据库阶段1.oracle2.mysql3.sqlserver目前中国软件公司用的最多的三大主流数据库是sqlserver,mysql,oracle.目前看来oracle数据库越来越流行了。一般情况下PHP...

网速正常,玩AVA很卡
楼下的真心瞎说! PING和延迟有关系,和网速与硬件都没有关系的。再说了I5+GT540M不用担心硬件。如果卡顿的话就是网络有问题。比如:你家网在电信你玩网通区。在网通玩电信去都会卡的。ping自然就飙到几百了,可能还飙到几千人家以为你是G ...

夏河县13959869026: Java两个线程操作一个变量,为什么变量的值会不一样呢 -
彘钓刺五: 这是JAVA线程中的并发安全性问题,比方说,有一个筐,有一个人不停往筐里放苹果,当放到第10个的时候,你自然认为筐里有10个苹果.但是你不知道的是另外有一个人趁你不注意的时候偷偷向外拿苹果,结果你认为是10个,结果一数只有...

夏河县13959869026: java 两个线程同时调用一个类里的同一个方法,这样会出现什么情况?有没有问题? -
彘钓刺五: 这个要看方法的功能,如果方法是修改同一个变量的话,有可能造成线程不同步,也就是说如果都把一个公用变量5 -1的话,2个线程都调用有可能结果是4,因为他们有可能都拿到5,然后都对5 -1,然后赋值给原来的变量 如果这个方法只是通过传入的参数计算后返回值,不涉及到修改公用变量的话,一点影响也没有

夏河县13959869026: java开两个线程操作同一个对象会有什么情况? -
彘钓刺五: 线程上锁了 有一段服务器代码,打印程序,打印程序只能有一个,有台打印机,那么它们必须等待先来的完成,上锁部分就必须等待 如果没有任何限制.b都想打印,有两个甚至多个网页去请求他,他会给每一个线程创建一个一样的对象去处理事物,那么每个线程都可能创建一个新对象,他们可以共享公共资源,另一个必须等待 如果只是部分代码被上锁,那么只有一个能获取到执行,如果a,那应该是操作共享资源,互不干扰 举个例子,而不用等待别人操作完 你说的两个线程去操作一个对象如果这个对象被上线程锁(线程安全)

夏河县13959869026: java中如果不加同步锁,多个线程对同一个变量修改,为什么会出现混乱 -
彘钓刺五: 因为线程的完成时间问题,有可能线程A先完成,将变量S赋值为s了,然后线程B再完成,将S赋值为s1,那么S的值就为s1;但是,有可能线程B先完成,将S赋值为s1,然后线程A再完成,给S赋值s,那么S的值就是s了.

夏河县13959869026: JAVA中两个线程为什么会交替执行? -
彘钓刺五: java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU.处于运行状态的线程会一直运行,直至它不得不放弃CPU. 一个线程会因为以...

夏河县13959869026: java中,两个线程同时调用同一个方法时,这两个线程真的是在同时执行这个方法吗??? -
彘钓刺五: 要分清方法和变量之间的关系 方法是变量的处理流程,变量才是一个实例的主体部分,方法是所有实例#共用#的一个流程而已无论哪个线程还是哪个实例都是共用同一个方法,所以都是可以同时执行这个方法的. 只是加上锁之后,被同一个锁锁住的实例调用的时候会把其他线程的调用暂停而已. 没加锁的则是同时运行方法,若是同一个实例里的话... 就会同时对该变量进行修改造成线程错误...所以一定是同一个方法... 只是有加锁没加锁是其他线程是否需要暂停等待的差别

夏河县13959869026: java多线程调用一个方法的问题 -
彘钓刺五: 如果是想多个线程同时跑多次这段代码,那么每次创建一个线程,之后直接通过方法调用这段代码即可.解释:java是多线程的,所以同时执行一段代码也是没问题的,会各自进行执行方法.

夏河县13959869026: java里线程安全是什么意思?有什么作用? -
彘钓刺五: 比如说,两个线程操作同一个ArrayList变量,那么一个线程这一时刻读的数据可能在下一刻要改变.一般在类似于下面的情景下考虑线程安全的问题:ArrayList products=new ArrayList ();products用来存放生产出来的产品.现在假设:有3个...

夏河县13959869026: java多线程读一个变量需要加锁吗 -
彘钓刺五: 如果只是读操作,没有写操作,则可以不用加锁,此种情形下,变量加上final关键字;如果有写操作,但是变量的写操作跟当前的值无关联,且与其他的变量也无关联,则可考虑变量加上volatile关键字,同时写操作方法通过synchronized加锁;如果有写操作,且写操作依赖变量的当前值(如:i++),则getXXX和写操作方法都要通过synchronized加锁.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网