`

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线程间通讯

    在Java编程中,线程间通信是多线程编程中的一个重要概念。当多个线程并发执行时,有时需要在线程间传递数据或者同步执行顺序,这就涉及到线程间通信。在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入...

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

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    java线程间等待并传递数据

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

    Java多线程Executors批量执行数据实现限流

    Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...

    Java线程(第三版)

    《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...

    java多线程经典案例

    线程通信是线程间交换信息的过程,主要用于协调不同线程的工作。Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,...

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...

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

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

    java多线程Demo

    在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    java线程与并发编程实践

    Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...

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

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

    java多线程分页查询

    通过对上述代码的分析可以看出,该方案充分利用了Java多线程技术的优势,通过预加载前一页的数据,大大提高了后续请求的响应速度。然而,在实际应用中还需要注意以下几点: - **线程池管理**:频繁地创建新线程可能...

    Java中利用管道实现线程间的通讯

    Java中的线程间通信是多线程编程中的关键部分,以确保不同线程之间的协作和数据交换。在Java中,管道(Pipe)流提供了一种有效的方法,允许数据从一个线程传递到另一个线程,从而实现线程间的通信。管道通常由两个流...

    java线程深入解析

    在多线程环境中,为了防止数据竞争和保证数据一致性,Java提供了多种同步机制: - **`synchronized`关键字**: 可以修饰方法或代码块,确保同一时间只有一个线程访问特定的代码区域,防止并发问题。 - **锁(Lock...

    JAVA线程学习(源代码)

    在Java中,线程间的通信可以通过wait()、notify()和notifyAll()方法实现,这些方法需要在synchronized代码块或方法中调用,以确保线程安全。另外,`java.util.concurrent`包中的BlockingQueue是一个高效的线程间通信...

    Java 线程间通信,生产者与消费者模型

    使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)

    java多线程处理大数据

    java多线程处理大数据,可根据配置的线程数,任务去调度处理

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

Global site tag (gtag.js) - Google Analytics