`
Will_Turner
  • 浏览: 69514 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java多线程对资源加锁同步无效是何原因?

 
阅读更多

public class IncrementAndDecrement {
	private static Integer balance=0;//引起竞争的资源
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ExecutorService executor=Executors.newCachedThreadPool();
		executor.execute(new IncrementTask());
		executor.execute(new DecrementTask());
		executor.execute(new DecrementTask());
		executor.execute(new IncrementTask());

		executor.shutdown();
		while(!executor.isTerminated()){
			
		}
		
		System.out.println("balance="+balance);
	}
	
	/**
	 * 递增操作任务
	 * @author Administrator
	 *
	 */
	private static class IncrementTask implements Runnable{
		public void run(){
			synchronized(balance){
				int newBalance=balance+1;
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				balance=newBalance;
			}
		}
	}
	
	/**
	 * 递减操作任务
	 */
	private static class DecrementTask implements Runnable{
		public void run(){
			synchronized(balance){
				int newBalance=balance-1;
				try {
					Thread.sleep(3);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				balance=newBalance;
			}
		}
	}

}
 程序想实现的效果是,对共享的资源(Integer类型的balance)进行增加和减少的操作,增加和减少分别通过两个线程任务来执行。在两个线程任务类中,在进行增或者减的时候都是用了synchronized关键字对资源(balance)加锁。但是执行的结果是并没有实现同步。我很疑惑,不知道什么原因。并且假如我将增减操作封装到方法当中,并且这些方法是用synchronized描述,那么执行的结果是同步的。Y ?
分享到:
评论
1 楼 feichenwangyalin 2012-09-17  
我也遇到这样的问题,兄弟解决了没??

相关推荐

    freelockqueue(多线程不需要加锁的队列性能很高)

    为了解决这个问题,"freelockqueue"应运而生,它提供了一种无需加锁的多线程队列实现,从而显著提升了程序的运行效率。 无锁队列的核心思想是利用原子操作(如Interlocked类提供的操作)以及硬件级别的内存模型来...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    Java多线程同步.pdf

    在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能满足对多线程进行同步的所有需要。因此,需要使用其他同步机制来满足不同的同步需求。 Java 多线程同步中的...

    java多线程的讲解和实战

    - 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    java 多线程同步

    Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...

    Qt两种方法实现多线程并安全结束线程及QMutex加锁Qt单例化实现

    - **线程同步**:QMutex是一种互斥锁,用于保护共享资源不被多个线程同时访问。在访问关键区域(可能引发竞争条件的部分)之前,应调用`lock()`,访问结束后调用`unlock()`。 - **加锁技巧**:确保每次`unlock()`...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    JAVA多线程编程技术PDF

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点...

    java 多线程并发实例

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

    汪文君JAVA多线程编程实战(完整不加密)

    学习《汪文君JAVA多线程编程实战》不仅能够提高读者对Java多线程编程的理解,还有助于培养良好的并发编程习惯,避免常见的并发陷阱。对于想要提升自己在并发编程领域技能的Java开发者来说,这本书无疑是一份宝贵的...

    java多线程查询数据库

    在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....

    java多线程处理数据库数据

    本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等操作。 首先,我们需要了解Java中的线程基础。线程是程序执行的最小单位,一个进程可以包含多...

    Java多线程同步具体实例讲解 .doc

    在Java中,为了保证线程安全,避免数据竞争和不一致的状态,我们通常会使用同步机制来控制对共享资源的访问。本文将通过一个具体的售票系统实例来深入解析Java中的线程同步。 首先,我们要了解Java中的关键字`...

    JAVA多线程练习题答案。

    这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等方面。 一、单项选择题 在单项选择题中,我们可以看到各种关于 JAVA 多线程编程的基本概念和...

    VisualStudio多线程共享资源加锁WindowsAPI封装类

    critical section是每个线程中访问临界资源的那段代码,不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。

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

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

Global site tag (gtag.js) - Google Analytics