`
woxiaoe
  • 浏览: 276718 次
  • 性别: 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多线程笔记

    Java线程:概念与原理 2 ...五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58

    java学习笔记2(多线程)

    java学习笔记2(多线程)java学习笔记2(多线程)

    多线程学习笔记

    多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助

    JAVA 多线程学习笔记

    NULL 博文链接:https://baobeituping.iteye.com/blog/1190260

    Java多线程笔记

    多线程学习笔记,好资源。包括线程基础等知识多线程学习笔记,好资源。包括线程基础等知识

    java 线程总结笔记

    花费了一上午的时候 写了一些demo。认识到四种线程池的区别。上传到csdn 供以后学习

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

    java线程 线程 教程 java线程教程 java线程学习资料 本教程有什么内容? 本教程研究了线程的基础知识— 线程是什么、线程为什么有用以及怎么开始编写使用线程的简单 程序。 我们还将研究更复杂的、使用线程的应用...

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

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关...第五章 Java线程编程的例子 第六章 Java线程调度 第七章 Java线程调度例子 第八章 和同步相关的高级主题 第九章 多处理器机器上的并行化 第十章 线程组

    Java线程讲解Java线程讲解

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

    Java并发编程学习笔记 pdf 多线程编程

    Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...

    java学习笔记5(java多线程)

    java学习笔记5(java多线程)java学习笔记5(java多线程)

    java多线程学习笔记

    这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于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线程:线程的调度-优先级 ...

Global site tag (gtag.js) - Google Analytics