java多线程问题请教

大家好,小弟刚学多线程,有个概念一直没搞懂,之前一直说如果在方法在创建多个实例对象然后调用其方法不会有线程安全问题,就是struts2 都说每个请求创建了一个新的实例就不会有线程问题。

 

那我做了个例子,运行结果一直都有问题,特请教

 

有2个类

 

public class Outputter2 {

//输出name
 public void output(String name) {
  int len = name.length();   
   for (int i = 0; i < len; i++) {
    System.out.print(name.charAt(i));
   }
   System.out.println();
   }

}

 

///////////////////////////

public class Outputter4 implements Runnable {

 private String name;
 
 public Outputter4(String name){
  this.name = name;
 }
 
 @Override
 public void run() {

  while (true) {
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   //System.out.println(name);
   new Outputter2().output(name);

  }
  
 }
 
 public static void main(String[] args) {

//每次都创建新的Outputter4
  new Thread(new Outputter4("aaaa")).start();
  new Thread(new Outputter4("bbbb")).start();
 }

}

 

打印效果,不正确:

aaaa
bbbb
abbbb
aaa
bbbb
aaaa
baaaa
bbb
aaaa

 请帮忙解释,我一直没弄明白错在那里?

 是不是由于name引起的,如果name不使用实例变量,怎么传递?

  在方法里使用对象变量是安全的是怎么解释?

 

谢谢!!!!

0
liujiafei_2007
liujiafei_2007 Outputter2类改为如下再运行试试是否符合要求。
大约 5 年之前 回复
liujiafei_2007
liujiafei_2007 Outputter2类改为如下再运行试试是否符合要求。 public class Outputter2 { // 输出name public void output(String name) { int len = name.length(); synchronized(Outputter2.class) { for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } } }
大约 5 年之前 回复

7个回答

我感觉你说的不正确是那因为打印出来的东西,不是aaaa bbbb 这种格式,而是有abbbb这种ab混合的形式,这个问题是因为jvm是的cpu是抢占式调度,也就是说相同的优先级,cpu会随机选择一个线程运行,而且一个线程没运行完有可能虚拟机也会让当前线程暂时放弃CPU,转到就绪状态,使其它线程获得运行机会。
换句话说多个线程同时运行你根本控制不住。
转到你的问题上,就是可能线程1运行for循环打印a的时候,线程2抢到cpu就打印b了,就这样交叉运行得到了你那结果。
而你说的安全,多线程的时候安全主要针对的是共享资源的安全,你这上面各个线程各自new了自己的对象,用的都是局部变量,所以不存在线程安全问题。

0
leeboysam
leeboysam 非常感谢大家的回复,谢谢!
大约 5 年之前 回复

挺正常的打印结果,有什么问题?
你想是什么样的?

0
线程安全问题一般是存在于多个线程对共享变量的操作才引起的,你这个示例不存在线程安全问题,因为两个线程分别使用的是两个不同的对象。
至于你说的“在方法里使用对象变量是安全的是怎么解释?”方法内部的变量都是临时变量,临时变量不存在线程安全问题,这个是java变量作用域的概念。你可以在去找资料好好看看。
0

线程安全是对多个线程操作改变一个对象的全局变量而言的,你这个没涉及线程安全问题,就是多个线程打印字母了,这个线程打a,那个线程打b,排在一起了

0

[code="java"]
int len = name.length();

for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
[/code]

在执行上述代码时“System.out.print(name.charAt(i))”代码会抢时间片,所以不可能你想的那样“aaaaa”、“bbbbbb”一起打印,代码执行没有问题。

0

public class Outputter2 {

// 输出name
public void output(String name) {
    int len = name.length();
    synchronized(Outputter2.class) {
    for (int i = 0; i < len; i++) {
        System.out.print(name.charAt(i));
    }
    System.out.println();
}

}
Outputter2类改为如下再运行试试是否符合要求。ps:不好意思,第一次使用,之前发到评论那里了。

0

拜托用代码格式器,看到这种就不想仔细阅读.累啊

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
程序员应该如何去请教别人问题
程序员应该如何提问
问题请教工程,问题请教工程
问题请教工程,问题请教工程,问题请教工程,问题请教工程,问题请教工程,问题请教工程,问题请教工程,问题请教工程,
讨论学术问题的英文邮件模板
学术问题的英文邮件模板,根据此可以向老外要文章等资源
问题请教高手
问题请教高手问题请教高手
职场新人请教问题一定不能犯的两个错误
俗话说金三银四,正是跳槽和找工作的季节,此时恰逢三月,很多朋友不是在找工作就是在找工作的路上。像是架构师米洛这样勤勤恳恳工作的,还有么?好吧,话不多说,咱们谈谈职场新人,在请教问题上一定不要犯的错误。 职场新人进入新的环境,不了解公司情况是肯定的,所以许多公司才会让领导带着入职。新人自己也要勤奋学习,尽快适应环境。本来新人请教问题很常见,但有些新人心态不是特别正确,这里整理一下,希望有所帮助
邮件发送问题
邮件发送问题,请教。
请教C语言问题
请教C语言问题
java多线程遇到的问题总结
1、当有全局性的参数的时候,需要为每个线程单独深度复制一个参数对象,不然在一个线程中对参数的修改可能会影响其他线程中参数的值,而造成间歇性的错误,不容易排查;...
java多线程经典问题--购票问题
java多线程经典问题–购票问题 要求: 1、三个窗口同时售票,一共20张票 2、售票期间互不干扰 想法: 1、多线程 2、死锁 3、静态变量的票数 class threadDemo extends Thread{ public String Tname;//定义窗口名字 public Thread thread;//线程 static Object ...
Java多线程解决哲学家就餐问题
问题描述:假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗米饭,每两个哲学家之间有一只筷子。假设哲学家必须用两只筷子吃东西。他们只能使用自己左右手边的那两只筷子。哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。 最笨的解决办法:只当哲学家发
java多线程经典问题二--银行存钱问题
实例:两个人向同一个账户里面存钱 public class Demo { public static void main(String[] args) { //1.创建任务类对象 CunQian cunQian = new CunQian(); //2.创建线程 Thread thread1 = new Thread(...
Java多线程引发的性能问题,怎么解决?
主要的影响如下: 消耗时间:线程的创建和销毁都需要时间,当有大量的线程创建和销毁时,那么这些时间的消耗则比较明显,将导致性能上的缺失 非常耗CPU和内存:大量的线程创建、执行和销毁是非常耗cpu和内存的,这样将直接影响系统的吞吐量,导致性能急剧下降,如果内存资源占用的比较多,还很可能造成OOM 容易导致GC频繁的执行:大量的线程的创建和销毁很容易导致GC频繁的执行,从而发生内存抖动现象,而发...
TF : Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
背景 在学习第一个TensorFlow程序的时,遇到的问题。 问题 程序 import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') meaning = tf.constant('The Answer to Life, the Universe and Everything is ') sess = tf.Sessi...
Java 关键字volatile 与 synchronized 作用与区别
1,volatile    volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的。   在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memo
Applese 的QQ群(二分+dfs)
链接:https://ac.nowcoder.com/acm/contest/330/F 来源:牛客网   时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Applese 有一个QQ群。在这个群中,大家互相请教问题。如 b 向 a 请教过问题,就把 a 叫做是 b 的&quot;老板&quot;。这...
Java多线程售票问题
1、代码 public class Test { public static void main(String[] args) { Tickets tickets = new Tickets(10); new Thread(tickets, "售票员A").start(); new Thread(tickets, "售票员B").start(); new Thread(
二十五、JAVA多线程(四、生产者和消费者问题)
一、生产者和消费者问题分析线程通信:不同的线程执行不同的任务,如果这些任务有某种关系,线程之间必须能够通信,协调完成工作。经典的生产者和消费者案例(Producer/Consumer):     分析案例:              1):生产者和消费者应该操作共享的资源(实现方式来做)。              2):使用一个或多个线程来表示生产者(Producer。             ...
读者写者问题(Java多线程)
class DataFile { //表示正在进行读取操作的人数 private int readerCount; //doreading 表示读信号量 当 doreading = true 时 表示有线程在读无法进行写操作 private boolean doreading; //dowriting 表示写信号量 当 dowriting = true 时 表
java 多线程实现 哲学家进餐问题
每个哲学家面前都有一碟通心面,由于面条很滑所以要两把叉子才能夹住。相邻两个碟子之间有一把叉子。哲学家两种活动:即吃饭和思考。当一个哲学家觉得饿时他就试图去取他左边和右边的叉子。如果成功地获得两把叉子,他就开始吃饭,吃完以后放下叉子继续思考
java多线程遇到的问题
       用线程池开启五个线程处理list数组,每个数组处理20条数据,最终结果是最后一个线程的数据处理了五次,而其他四个线程中的数据自动消失了。查找原因是因为开启线程的时候没有new 一个新的runnable的子类,导致每次五个线程中的数据是共享的,所以前四个线程中的数据都修改为了最后一个线程中的数据。       开启多线程时,每次都要new一个runnable的子类。...
java模拟多线程买票问题
多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式是synchronized + 锁对象,同样采用诸如Lock即显式的声明concurrent中的锁也可以实现同样的效果,可根据实际情况酌情使用,以下分别采用不同的方式实现模拟多窗口买票场景 方式1...
java多线程(6)--多线程的安全问题总结
1、多线程安全问题分析   多线程安全问题原因是在cpu执行多线程时,在执行的过程中可能随时切换到其他的线程上执行。      在以上红色选中的三个部分,线程都有可能进行切换。只要cpu在这个三个地中的任何地方切换了,都可能导致错误数据出现,线程的不安全因素就有了。     造成错误数据的原因是多个线程可能出现同时访问num的情况。而任何一个线程在访问num的过程中都可以切换到其他的线程
Java多线程引发的性能问题以及调优策略
本文主要介绍了Java多线程引发的性能问题以及调优策略,包括对线程同步、线程池、以及伪共享所引发的问题,并提出了相应的解决方法...
java多线程卖票问题,解决线程安全
需求:设计程序,利用多线程的思想模拟三个售票员卖50张票的功能 package com.demo.first; public class Demo03 { public static void main(String[] args) { Object obj = new Object(); WindowThread thread01 = new WindowThread(&quot;窗口一&quot;, ...
java 多线程开发注意事项
多线程开发的三大特性 有序性 可见性 对修改后的数据可以看到拥有可见性 原子性 代码在执行的时候必须一次执行完,一次成功或者是一次失败,一次线程对一段代码有掌控,就像事务里面的原子一样 线程,本地内存你,驻村交互图 在jvm中的三大特性 有序性 编译器会对代码以及指令进行编译重排. 1. 编译器优化重排 2. 指令集重排 3. 内存系统重排 经过三次重新排序经...
【java 多线程】多线程并发同步问题及生产者、消费者问题
一、线程并发同步概念 线程同步其核心就在于一个“同”。所谓“同”就是协同、协助、配合,“同步”就是协同步调昨,也就是按照预定的先后顺序进行运行,即“你先,我等, 你做完,我再做”。 线程同步,就是当线程发出一个功能调用时,在没有得到结果之前,该调用就不会返回,其他线程也不能调用该方法。 就一般而言,我们在说同步、异步的时候,特指那些需要其他组件来配合或者需要一定时间来完成的任务。
生产中遇到的Java多线程问题
1. 问题场景:前几天一位同事分享了一段代码,这段代码在线上偶尔会报空指针异常,虽然是一个简单的NullPointerException,却是一个很不容易发现的多线程问题导致的,我们一起先来看下代码(这是我复原的测试代码,并非和生产一致,但整体逻辑是一样的): public class TestSingleton {     private static volatile TestSingl...
java多线程入门案例(1)之简单银行取款问题及其优化
      之前学java的时候,学校老师由于课时问题,没有教我们多线程,最近学校外聘的企业教师给我们做实训要用到多线程,因此才初步了解多线程,以下这个案例只是介绍java代码优化,代码中有涉及多线程,但今天不对其讲解,只简单讲解代码优化的问题,希望对初学者有帮助。   大概案例:有PeasonA跟PeasonB在银行(bank)以同一个账号取钱,取钱方式可以为柜台取款和ATM机取款。银行账号总...
Java多线程:数据共享以及线程安全问题
多线程的线程安全问题一直是很多人都在谈论的问题,下面就该问题来发表一下我所学习到以及对该方面的见解. 说到线程安全问题,那就需要先说一下线程中的数据共享,尤其是在多个线程之间进行交互时尤为重要. - 不共享的情况属于多个线程对数据操作时,数据之间是不共通,互不影响的. - 共享类似于多个线程共通操作一个私有变量,任何一个线程都可以对其进行操作,例如一个线程对这个数据进行增...
如何向别人问问题
1.组织问题: 首先要把问题组织一下,要让大部分人看懂你问的问题;在网上一定要把先把问题概括一下,尽量避免  先喊人 再问问题,这样没人愿意接,要设身处地为回答人考虑,别人不知道你的问题的情况下,也不知道能不能解决你的问题,不会贸然接下, 2.注意事项: 一般礼节要有,现实生活中,尽量不让来解决你问题的人等着你,有事尽量先放一下。还有你不能让来帮你的人站着,而你坐着,这样很不礼貌,你
多线程解决现实中的抢票问题(初级)
多线程解决现实中的抢票问题 以下为两种解决方式: 1.实现Runnable接口 2.继承自Thread 1.第一种方法(正确)Public class A extends Thread{ Public static int tickets = 100; Public static String str = new String(
查阅文献时向原作者发邮件要文献的简单模板
Dear Professor XXX, I am in XXX Institute of XXX, XXX university. I am writing to request your assistance. I search one of your papers:…………………(论文题目) but I can not read full-text content. Would you
吃放水果 java(多线程)
吃放水果的gui开发,适合 java初学者(多线程)
JAVA多线程案例之数字加减(生产者消费者模式)中遇到的问题
直接看一段代码,经典的生产者消费者模式,用多线程来实现数字的加减: package test; /** * Created by ZhuHao on 2018/10/14 */ class Resource{ private int num = 0; private boolean flag = true; public synchronized void a...
java多线程(二)解决共享资源竞争
【博客为自己复习准备面试知识梳理、总结用,如有错误,望各路大神指正,不胜感激!】 1、问题的出现 /* * 这是一个整数生成器 * canceled 表示这个对象是否已被取消 * */ public abstract class IntGenerator { private volatile boolean canceled = false; public abstract int
操作系统多线程例子--吃水果问题
import java.util.concurrent.locks.*; class Resource // 封装水果资源,提供放水果和吃水果方法。 { private String name; private static int ap = 0; // 苹果信号,0表示无,1表示有 private static int or = 0; // 橘子信号,0表示无,1表示有 privat...
Java多线程之厨师与食客问题
问题描述 假设分别有4位厨师和6位食客。 厨师做一盘菜的时间是4S,食客吃一盘菜的时间是3S。 每位厨师做好菜后放入有固定容量(10盘)的桌子上。 如果厨师做好菜发现桌子上已经有10盘菜了,就必须等待任意一个食客吃掉一盘后才能放入; 如果食客取菜时发现桌子上没有菜,也必须等待有任一厨师做好菜放入桌子才能取用。 代码: Test类: public class Test{ ...
个人总结40个Java多线程面试问题和答案
个人总结40个Java多线程面试问题和答案,很全面,让你不再担心多线程的面试问题。
java中的多线程和数据同步问题
编程中有一个经典的多线程问题:有两个线程,一个负责写入数据,一个负责读出数据,当两个线程同步运行时,如何保证数据的准确性和安全性?人们将这一问题抽象成生产者-消费者模型。 //有一个数据模型Person类,包含三个属性以及写入和读取这三个属性的方法。 public class Person { private String name; private String gender; p...
JAVA多线程不安全问题解决方案(多线程并发同一资源)。
引例:吃苹果比赛,3个人同时吃50个苹果,谁先拿到谁就吃,每个哦ing过都有编号。 问题: 多线程同时执行的时候可能出现不安全问题 当3个人同时拿到一个苹果,他们的编号就一样,当时主要看是谁先吃掉苹果 除非拿到苹果和吃掉苹果是连续同步执行,没有其他的线程干扰 方案一: 设置同步代码块(同步锁)。 synchronized(共享资源){ 同步执行代码; } class App