`

Java 线程间数据交换的疑惑

 
阅读更多

请教一个问题, 如果没有锁,Java线程间是如何交换数据的?如果想了解Java对这个问题的描述,我该看那个资料。
各个线程有各自的Working memory,如果没有锁,它们会错误的交换数据?

 

1. Java的内存模型是怎样的呢?

根据这篇文章所述(Java 线程/内存模型的缺陷和增强),Java中有一个主内存(Main Memory),Java中每个线程都有各自的内存(Working Memory)。

 

2 如果没有锁,程序是不对的,我们该怎样理解这个错误呢。

下面是不带锁的代码(附件为代码)

 

public class TestVolatile {

	public static void main(String[] args) throws InterruptedException {
		final ConcurrencyTest01 test = new ConcurrencyTest01();
		Thread thread11 = new Thread(new BasicTestRunnable(test, 11));
		Thread thread12 = new Thread(new BasicTestRunnable(test, 12));

		thread11.start();
 		thread12.start();
 	}
}

public class BasicTestRunnable implements Runnable {
	ConcurrencyTest01 test;
	int type;

	public BasicTestRunnable(ConcurrencyTest01 test, int type) {
		super();
		this.test = test;
		this.type = type;
	}

	@Override
	public void run() {
		while (true) {
			switch (type) {
			case 1:
				test.one();
				break;
			case 2:
				test.two();
				break;
			case 11:
				test.eleven();
				break;
			case 12:
				test.twelve();
				break;
			}
		}
	}
}

public class ConcurrencyTest01 {
	static int i = 0, j = 0;
	int x = 0, y = 0;

	static void one() {
		i++; j++;
	}

	static void two() {
		System.out.println("i=" + i + " j=" + j);
	}
	
	void eleven() {
		x++; y++;
	}

	void twelve() {
		System.out.println("x=" + x + " y=" + y);
	}
}

 输出结果

 

x=1443657134 y=1443657161
x=1443658375 y=1443658405
x=1443659636 y=1443659665
x=1443661310 y=1443661339
x=1443662965 y=1443662995
x=1443665005 y=1443665035
x=1443666585 y=1443666614
x=1443667781 y=1443667812
x=1443668924 y=1443668954

 

这是我的疑惑,望赐教。

分享到:
评论

相关推荐

    JAVA100例之实例64 JAVA线程间通讯

    JAVA100例之实例64 JAVA线程间通讯

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

    java线程间等待并传递数据

    NULL 博文链接:https://huihuilou.iteye.com/blog/1934814

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java多线程实现大批量数据导入源码

    java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制

    Java线程详解大全

    Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程

    Java线程状态流转图

    Java线程状态流转图

    java多线程处理数据库数据

    java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。

    Java线程Java线程Java线程Java线程

    Java线程Java线程Java线程Java线程Java线程Java线程

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    java线程 线程学习资料 java线程教程

    我们还将研究更复杂的、使用线程的应用程序的基本构件— 如何在线程之间交换数据、如何控制 线程以及线程如何互相通信。 我应该学习这个教程吗? 本教程适用于拥有丰富 Java 语言应用知识,但又没有多少多线程或并发...

    java 线程java 线程

    java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程

    java多线程数据流发送信息

    java 多线程 数据流 tcp thread i/o

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 ...Java线程:线程之间的数据传递 58

    多线程进程间交换数据使用的共享内存

    多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存

    Java多线程调用BlockingDeque跑批量数据的例子

    一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...

    Java线程间通信的代码示例.zip

    内容概要:Java线程间通信的代码示例 适用人群:Java 使用场景:Java线程间交换数据 目标:通过本资源示例,深刻理解线程间通讯的基本原理和实现方法,解决工作中实际问题。

    Java线程模块Java线程之秒表

    Java线程模块Java线程之秒表新手学习Java线程模块时,利用Java中设置线程的暂停间隔,做的简易秒表

Global site tag (gtag.js) - Google Analytics