A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨杨 中级黑马   /  2013-3-21 18:46  /  2042 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨杨 于 2013-3-22 09:06 编辑
  1. package cn.ithema.test;

  2. import java.util.Random;

  3. public class ThreadScopeShareData {

  4. /**
  5. * @param args
  6. */
  7. private static int data =0;
  8. public static void main(String[] args) {
  9. for(int i=0;i<2;i++){
  10. new Thread(new Runnable(){
  11. @Override
  12. public void run() {
  13. data = new Random().nextInt();
  14. System.out.println(Thread.currentThread().getName()
  15. + " has put data :" + data);
  16. new A().get();
  17. new B().get();
  18. }
  19. }).start();
  20. }
  21. }
  22. static class A{
  23. public static void get(){
  24. System.out.println("A from"+Thread.currentThread().getName()
  25. +"get data " +data);
  26. }
  27. }
  28. static class B{
  29. public static void get(){
  30. System.out.println("B from"+Thread.currentThread().getName()
  31. +"get data " +data);
  32. }
  33. }

  34. }
复制代码
输出

Thread-0 has put data :-1931552408
A fromThread-0get data -1931552408
B fromThread-0get data -1931552408
Thread-1 has put data :214244390
A fromThread-1get data 214244390
B fromThread-1get data 214244390
这样就符合了 没个线程独享自己的 数据,就没有线程安全问题了
但是张老师写这段代码的时候出现线程 直接数据有问题
求出问题的代码。
或者有因为多线程 共享数据出现问题的代码也行啊求问题代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 王晓楠 于 2013-3-21 22:41 编辑

你多运行几次试试,有两个线程,每个线程存入和获取,这里存在线程安全,当线程1存入时,还没等开始读,线程2又开始存入,则,线程1取到的不是他本身存入的值了。
  1. package thread;

  2. import java.util.Random;

  3. public class ThreadDemo {

  4.         /**
  5.          * @param args
  6.          */
  7.         private static int data = 0;

  8.         public static void main(String[] args) {
  9.                 for (int i = 0; i < 2; i++) {
  10.                         final String x = "a";
  11.                         new Thread(new Runnable() {
  12.                                 @Override
  13.                                 public void run() {
  14.                                         synchronized (x) {
  15.                                                 data = new Random().nextInt();
  16.                                                 System.out.println(Thread.currentThread().getName()
  17.                                                                 + " has put data :" + data);
  18.                                                 new A().get();
  19.                                                 new B().get();
  20.                                         }
  21.                                 }
  22.                         }).start();
  23.                 }
  24.         }

  25.         static class A {
  26.                 public static void get() {
  27.                         System.out.println("A from" + Thread.currentThread().getName()
  28.                                         + "get data " + data);
  29.                 }
  30.         }

  31.         static class B {
  32.                 public static void get() {
  33.                         System.out.println("B from" + Thread.currentThread().getName()
  34.                                         + "get data " + data);
  35.                 }
  36.         }

  37. }
复制代码
可以使用同步代码块,如上,锁是x,共用的,每个线程执行代码块中的内容时,必须要获得x这个锁,所以存入和获取就不会冲突了!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
王晓楠 发表于 2013-3-21 22:09
你多运行几次试试,有两个线程,每个线程存入和获取,这里存在线程安全,当线程1存入时,还没等开始读,线 ...

我的问题是本应该冲突但是测试的结果分析没冲突
回复 使用道具 举报
今天又测试了好几次
第一次
Thread-0 has put data :284435628
Thread-1 has put data :-1330976474
Thread-2 has put data :959525600
Thread-3 has put data :-1174287832
Thread-4 has put data :-2091226089
Thread-5 has put data :-49048226
A fromThread-5get data -49048226
A fromThread-4get data -49048226
A fromThread-3get data -49048226
A fromThread-2get data -49048226
A fromThread-1get data -49048226
A fromThread-0get data -49048226
B fromThread-1get data -49048226
B fromThread-0get data -49048226
B fromThread-5get data -49048226
B fromThread-3get data -49048226
B fromThread-4get data -49048226
B fromThread-2get data -49048226
冲突了
第二次
Thread-0 has put data :1131982148
A fromThread-0get data 1131982148
B fromThread-0get data 1131982148
Thread-1 has put data :2032200608
A fromThread-1get data 2032200608
B fromThread-1get data 2032200608
Thread-2 has put data :1525772459
A fromThread-2get data 1525772459
B fromThread-2get data 1525772459
Thread-3 has put data :928460600
A fromThread-3get data 928460600
B fromThread-3get data 928460600
Thread-4 has put data :-445605323
A fromThread-4get data -445605323
B fromThread-4get data -445605323
Thread-5 has put data :1498601656
A fromThread-5get data 1498601656
B fromThread-5get data 1498601656
不冲突
其余20次不冲突
谢谢二楼

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马