`
snoopy7713
  • 浏览: 1141382 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

java多线程总结四:volatile、synchronized示例

    博客分类:
  • java
阅读更多

1、synchronized保证同步

先看一个生成偶数的类

 

package demo.thread;

/**
 *这是一个int生成器的抽象类
 * 
 */
public abstract class IntGenerator {
	
	private volatile boolean canceled = false;

	public abstract int next();

	public void cancel() {
		canceled = true;
	}

	public boolean isCanceled() {
		return canceled;
	}
}
 
/*
 * 产生偶数
 */
class EvenGenerator extends IntGenerator {
	private int currentEvenValue = 0;
	String s = "";

	@Override
	public int next() {
		<span style="color:#ff0000;">synchronized </span>(s) {
			++currentEvenValue;
			++currentEvenValue;
			return currentEvenValue;
		}
	}

//	//这样也可以
//	public <span style="color:#ff0000;">synchronized </span>int next() {
//			++currentEvenValue;
//			++currentEvenValue;
//			return currentEvenValue;
//	}
}

 注意到在产生偶数是要加同步锁,否则可能线程1刚好执行了一句++currentEvenValue;操作,就被线程2抢去了cpu,此时线程2执行return currentEvenValue;这时返回的就是一个奇数。加synchronized 就是两个线程同时只能一个线程执行synchronized 块的代码。

测试代码:

package demo.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
 * 消费数字
 */
public class EvenChecker implements Runnable {
	
	private IntGenerator generator;
	private final int id;

	public EvenChecker(IntGenerator g, int ident) {
		generator = g;
		id = ident;
	}

	public void run() {
		while (!generator.isCanceled()) {
			int val = generator.next();
			if (val % 2 != 0) {//如果不是偶数
				System.out.println(val + " not enen!");
				generator.cancel();
			}
		}
	}

	public static void test(IntGenerator gp, int count) {
		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i < count; i++)
			exec.execute(new EvenChecker(gp, i));
		exec.shutdown();
	}

	public static void test(IntGenerator gp) {
		test(gp, 10);
	}

	public static void main(String[] args) {
		test(new EvenGenerator());
	}
}

 分析:如果产生偶数的类未加synchronized ,那么测试程序将会出现奇数导致退出程序。

 

2、volatile表示原子性,可见性。

      对于多个线程之间共享的变量,每个线程都有自己的一份拷贝,当线程1改变变量值时,其他线程并不马上知道该变量值改变了,volatile就保证了变量值对各个线程可见,一个线程改变该值,马上其他线程中该值也改变。原子性表明操作不可中断,如基本变量赋值。

     代码示例:

package demo.thread;

public class VolatileDemo implements Runnable {
	
	private volatile int i = 0;//volatile设置可见性

	public synchronized  int getValue() {
		return i;
	}

	private synchronized void enenIncrement() {
		i++;
		i++;
	}

	@Override
	public void run() {
		while (true)
			enenIncrement();
	}

	public static void main(String[] args) {
		VolatileDemo at = new VolatileDemo();
		new Thread(at).start();
		while (true) {
			int val = at.getValue();
			if (val % 2 != 0) {//出现奇数,退出程序
				System.out.println(val+" is not enen!");
				System.exit(0);
			}
		}

	}
}

 注意i++操作并不是原子行操作,getValue() 方法也要加synchronized 。

分享到:
评论

相关推荐

    JAVA 多线程的PPT和示例

    这份"JAVA多线程的PPT和示例"将深入讲解这些内容,帮助开发者更全面地理解和掌握Java多线程技术。 首先,让我们来看看继承Thread类的多线程创建方法。当一个类直接继承Thread类时,该类就具备了创建线程的能力。...

    java多线程的讲解和实战

    8. **并发集合类**:Java提供了并发安全的集合类,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `BlockingQueue`等,它们内部实现了线程安全的算法,可以在多线程环境下高效使用。 9. **线程中断**:`interrupt...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的...以上内容只是《Java多线程编程核心技术》教程中的一部分核心知识点,实际学习中还需要结合具体示例和实践来深入理解和掌握。通过学习,开发者可以编写出高效、稳定的多线程Java程序。

    Java 多线程学习总结归纳(附代码)

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面是对Java多线程学习的详细解析。 1. **多线程概述*...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    java多线程中的volatile和synchronized用法分析

    在Java多线程编程中,volatile和synchronized是两种重要的同步机制,用于处理并发环境下的数据一致性问题。这里我们将深入探讨这两个关键字的用法、作用以及它们之间的区别。 首先,volatile关键字。volatile确保了...

    Java多线程示例 可以直接运行

    Java多线程是Java编程中的重要组成部分,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。本示例提供了可以直接运行的Java多线程代码,帮助...

    Java 多线程 订票 示例 线程安全

    总结起来,Java多线程在实现订票系统时,需要注意线程安全问题,通过合理使用同步机制、Lock接口和原子类,可以在保证数据一致性的同时提高并发性能。在实际开发中,要根据业务场景选择合适的线程安全策略,以达到...

    java多线程编程实例_Source

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本实例源码中,包含17个章节和上百个实例,旨在深入讲解Java多线程的核心概念和实际应用。 一、线程基础知识 在Java中,...

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...

    Java线程之线程同步synchronized和volatile详解

    Java线程之线程同步synchronized和volatile详解 Java线程同步是Java多线程编程中...Java线程同步是Java多线程编程中非常重要的一个方面,需要正确地使用synchronized和volatile关键字来保证线程安全、可见性和有序性。

    详细剖析JAVA多线程案例教学

    ### JAVA多线程案例教学详析 #### 一、引言 随着计算机技术的发展,多核处理器已经成为标准配置,为了充分利用硬件资源,提高程序的执行效率,多线程编程成为了现代软件开发中不可或缺的一部分。Java作为一种广泛...

    JAVA多线程模式高清版+DEMO

    这个压缩包文件"JAVA多线程模式高清版+DEMO"显然是关于Java多线程设计模式的详细教程,很可能包含了理论讲解、代码示例以及实战DEMO。 在Java多线程编程中,了解和掌握以下知识点至关重要: 1. **线程的创建与启动...

    深入浅出Java多线程.pdf

    - **Thread 类**:Java 中实现多线程的主要方式之一,继承自 Object 类,实现了 Runnable 接口。 - **Runnable 接口**:实现此接口以定义线程的任务,通常与 Thread 类结合使用。 - **Callable & Future**:提供了...

    JAVA多线程教材

    2. **线程同步与通信**:在多线程环境中,数据共享可能导致竞态条件和死锁,Java提供了多种同步机制来避免这些问题,如synchronized关键字、volatile变量、Lock接口(ReentrantLock、Semaphore等)以及wait()、...

    Java多线程管理示例

    Java多线程是Java编程中的一个关键特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程的核心概念、...

    java多线程并发实战和源码

    总结来说,Java多线程并发实战和源码的学习涵盖了线程创建与管理、同步机制、并发容器、内存模型以及并发工具类等多个方面。虽然书中实例不足,但通过结合其他资源,如jcip-examples-src.rar中的代码,可以进一步...

    java多线程进度条实例

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。本实例将探讨如何利用Java实现一个具有进度条显示功能的多线程应用。进度条通常用于可视化地表示某个任务的完成程度,这对于长...

    java多线程源码,仅供参考

    Java多线程是Java编程中的核心概念,尤其在并发编程领域,它的重要性不言而喻。这个名为"java多线程源码,仅供参考...通过分析和运行这个示例,我们可以直观地看到多线程在实际场景中的应用,加深对Java多线程的理解。

    JAVA 多线程的两点误区

    总结来说,Java多线程编程中存在许多常见的误区,尤其是对于初学者而言。正确理解线程的启动与执行状态、掌握线程间的数据共享与同步机制是非常关键的。希望以上内容能够帮助大家更好地理解和应用Java多线程技术。

Global site tag (gtag.js) - Google Analytics