`
woxiaoe
  • 浏览: 283582 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java线程学习笔记(五)资源共享问题

    博客分类:
  • Java
阅读更多

IncreaseClient 中持有一个base,每次调用起increase方法后,返回原先的值,

increase方法自加两次,在check方法中判断返回值和最新值是否相差2.在多线程的环境下就会出错,因为++base不是原子性操作

package com.woxiaoe.study.thread;

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

/**
 * 自加类
 * @author 小e
 *
 * 2010-4-24 下午08:39:19
 */
public class IncreaseClient {
	private int base = 0;

	public IncreaseClient() {
	}
	public int increase(){
		int pre = base;
		++ base;
		Thread.currentThread().yield();
		++ base;
		return pre;
	}
	public boolean check(){
		int pre = increase();
		System.out.println("pre:" + pre + "\t" + "increase:" + base);
		return pre - base == -2?true:false;
	}
	
	public static void main(String[] args) {
		IncreaseClient ic = new IncreaseClient();
		ExecutorService exec = Executors.newCachedThreadPool();
		for(int i = 0; i < 10; i++){
			exec.execute(new IncreaseChecker(ic));
		}
	}
	

}

 

package com.woxiaoe.study.thread;
/**
 * 验证多线程下自加的准确性
 * @author 小e
 *
 * 2010-4-24 下午08:38:14
 */
public class IncreaseChecker extends Thread {
	private IncreaseClient ic;
	
	public IncreaseChecker(IncreaseClient ic) {
		this.ic = ic;
	}



	@Override
	public void run() {
		while(ic.check()){
		}
		System.out.println(Thread.currentThread() + "自增出错");
		System.exit(0);
	}
	
	

}

 解决资源共享的最简单方法极为给会产生冲突的方法加把锁,本例中只需将chenk()方法做如下修改

public synchronized boolean check(){
		int pre = increase();
		System.out.println("pre:" + pre + "\t" + "increase:" + base);
		return increase() - base == -2?true:false;
	}

 另一种方法是显示的给代码加把锁:

public boolean check(){
		lock.lock();
		try{
		int pre = increase();
		System.out.println("pre:" + pre + "\t" + "increase:" + base);
		return pre - base == -2?true:false;
		}finally{
			lock.unlock();
		}
	}

 

大体上当使用synchronized关键字时,需要写的代码量更少,并且用户出现的可能性也会降低,因此通常只在解决特殊问题时,才会显示的Lock对象。Lock对象提供了更细粒度的操作。

分享到:
评论

相关推荐

    java线程学习笔记

    Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...

    JAVA 多线程学习笔记

    Java线程有五种状态:新建、就绪、运行、阻塞和终止。`Thread.State`枚举类型表示这些状态,理解它们有助于优化线程管理。 三、线程同步 1. 同步机制:为了解决多线程并发访问共享资源导致的数据不一致问题,Java...

    java多线程笔记

    Java线程是多任务编程的重要组成部分,它允许程序同时执行多个独立的代码片段,从而提高程序的效率和响应性。本文将深入探讨Java线程的概念、原理以及如何在实际编程中进行有效管理。 首先,我们要了解操作系统中的...

    Java多线程学习笔记

    ### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...

    java多线程学习笔记

    这篇文档和源代码将深入探讨Java多线程的各个方面,旨在帮助学习者掌握这一关键技术。 首先,我们要了解Java中创建线程的两种主要方式:继承Thread类和实现Runnable接口。继承Thread类时,我们需要重写run()方法,...

    java多线程笔记全手打

    本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、线程基础知识 线程是操作系统分配CPU时间的基本单位,一个进程中可以包含多个线程。Java通过`Thread`类...

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    ### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    - 当多个线程访问共享资源时,需要进行同步控制,防止数据不一致。 - `synchronized`关键字可实现锁机制,保证同一时刻只有一个线程执行特定代码块或方法。 - `volatile`关键字确保线程间变量的可见性,但不保证...

    Java并发编程学习笔记.rar

    这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...

    张孝祥Java多线程与并发库高级应用笔记

    张孝祥的这套视频教程旨在深化Java线程技术的学习,帮助已有一定基础的开发者进一步提升技能。它并非面向完全的初学者,学习过程可能较为艰难,需反复研习方能深入理解。一旦掌握,学员将对Java线程技术有更为卓越的...

    Java中线程同步和线程协作学习笔记

    线程同步的主要目标是解决线程安全问题,即在多线程访问共享资源时避免数据的混乱,保证程序的可再现性。这通常涉及到临界资源的管理,如打印机、共享变量或数据结构。在Java中,线程同步可以通过使用同步锁来实现,...

    JAVA多线程学习笔记整理(csdn)————程序.pdf

    - **线程的停止**:线程不能被外部强制停止,应通过共享变量或中断标志来提示线程结束,让线程自行释放资源并退出。 3. **线程类型** - **用户线程**:正常执行任务的线程,进程会等待所有用户线程执行完毕后才...

    JUC学习笔记(Java多线程)

    首先,我们来了解一下Java线程。线程是程序执行的基本单元,允许多个任务在同一时间运行,从而提高了系统资源的利用率。在Java中,可以使用`Thread`类或实现`Runnable`接口来创建线程。线程的状态包括新建、就绪、...

    Java多线程源码笔记.pdf

    7. 线程池:Java提供了ExecutorService和ThreadPoolExecutor等工具来管理线程池,线程池可以有效控制运行的线程数量,避免频繁创建销毁线程的开销,提高响应速度和系统资源利用率。 8. 死锁:当两个或更多线程互相...

    多线程学习笔记,关于创建线程,删除线程等相关指令的应用。

    在计算机科学中,多线程是一种编程模型,允许一个应用程序同时执行多个任务。这提高了系统的效率,特别是...在实际开发中,根据应用需求选择合适的线程管理和资源回收策略,可以有效避免资源浪费和潜在的竞态条件问题。

    java基础核心学习笔记

    本学习笔记将深入探讨Java的核心概念,帮助你建立坚实的基础。 1. **Java语法基础** - 变量与数据类型:Java支持基本数据类型(如int、float、char)以及引用数据类型(如类、接口、数组)。变量声明必须指定类型...

Global site tag (gtag.js) - Google Analytics