`
onlyor
  • 浏览: 379984 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

在同一个类中,线程资源竞争

    博客分类:
  • java
阅读更多

 

 

/**
 * 在同一个类中,线程资源竞争
 *
 */
public class ThreadTest12 implements Runnable {  
	
    public static ThreadTest12 test1;
    
    public static ThreadTest12 test2;
    
    public static void main(String[] args) throws InterruptedException {
    	new Thread(new ThreadTest12()).start();
    	//new Thread(new ThreadTest12()).start();
    	/*
    	1 都是 synchronized (test1)  
    	Thread-0
    	Thread-1
    	Thread-0start run1
    	Thread-0end   run1
    	Thread-1start run2
    	Thread-1end   run2
    	
    	2  一个是 synchronized (test1)  另一个是 synchronized (test2)
    	Thread-0
		Thread-1
		Thread-0start run1
		Thread-1start run2
		Thread-0end   run1
		Thread-1end   run2
    	 */


	}
    
    
    public static ThreadTest12 instentce() {
    	
    	String name = Thread.currentThread().getName();
		if ("Thread-0".equals(name)) {
			if (test1 == null) {
				test1 = new ThreadTest12();
			}
	    	return test1;
		} else {
			if (test2 == null) {
				test2 = new ThreadTest12();
			}
	    	return test2;
		}
    }
    
    private void run1() throws InterruptedException {
    	System.out.println(Thread.currentThread().getName());
    	synchronized (test1) {
    		System.out.println(Thread.currentThread().getName() + "start run1");
    		Thread.sleep(9900);
    		System.out.println(Thread.currentThread().getName() + "end   run1");
    		//ThreadTest12.instentce().run2();
        }
    }
    
    private void run2() throws InterruptedException {
    	System.out.println(Thread.currentThread().getName());
    	
    	// synchronized (test2)  没有发生资源竞争
    	synchronized (test1) { // 发生资源竞争
    		System.out.println(Thread.currentThread().getName() + "start run2");
    		Thread.sleep(9900);
    		System.out.println(Thread.currentThread().getName() + "end   run2");
        }
    }

	@Override
	public void run() {
		try {
			String name = Thread.currentThread().getName();
			if ("Thread-0".equals(name)) {
				ThreadTest12.instentce().run1();
			} else {
				ThreadTest12.instentce().run2();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

} 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    易语言类中启动线程

    在易语言类中启动线程,意味着在类的一个实例中创建一个新的执行流,这个执行流独立于创建它的主线程和其他线程,可以并行执行特定的任务。 3. 易语言线程创建: 易语言提供了“创建线程”命令来创建新的线程。通常...

    向量在同一个块中用多个线程执行

    在CUDA编程中,"向量在同一个块中用多个线程执行"是一种并行计算策略,主要用于提升GPU的计算效率。CUDA(Compute Unified Device Architecture)是NVIDIA推出的一种编程模型,它允许程序员直接利用GPU的强大计算...

    MFC同步线程类

    在C++编程中,Microsoft Foundation Class (MFC) 库为开发者提供了强大的工具来处理多线程编程。本文将深入探讨MFC中的...在实际开发中,应根据具体需求选择合适的同步对象,避免死锁和资源竞争,确保程序的正确运行。

    vc++中的线程锁(线程锁保持线程同步)

    在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...

    线程编程 四个线程...

    * 资源竞争:多线程编程中,多个线程可能会竞争相同的资源,需要使用合适的资源管理机制来避免资源竞争。 在这个例子中,我们可以看到四个线程都在执行相同的操作,但是它们之间没有同步和通信。这种情况下,可能会...

    线程同步机制解决多线程资源访问冲突

    在多线程编程中,线程同步是一种至关重要的技术,用于协调并发执行的线程,以确保它们正确、有序地访问共享资源,防止数据不一致和资源竞争问题。本篇文章将深入探讨线程同步机制以及如何使用事件对象来实现这一目标...

    MFC中的多线程同步

    一个典型的用法可能包括创建一个CMutex对象,然后在线程中使用`Lock()`和`Unlock()`方法来控制对共享资源的访问。如果有多个线程尝试同时访问,只有一个会成功获取锁,其余的将被阻塞直到锁被释放。 通过深入研究和...

    C#多线程互斥实例 多线程获取同一变量

    2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,...

    MFC多线程同步类的使用

    - MFC的同步类用于解决线程间的同步问题,防止资源竞争和数据不一致性。 - 同步对象包括:`CSyncObject`(基类)、`CSemaphore`、`CMutex`、`CCriticalSection`和`CEvent`。 - 同步访问对象:`CMultiLock`和`...

    模拟jdbc多线程竞争资源---【Eclipse项目】

    这个项目可能是用Eclipse IDE创建的一个Java工程,包含示例代码来模拟多线程环境下JDBC的资源竞争问题,并提供解决方案。开发者可以通过运行这些示例,观察并发问题的表现,学习如何避免和解决这些问题。 6. 性能...

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

    在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现方式。Java作为一种广泛应用于分布式系统开发的编程语言,其内部...

    查看线程资源占用工具

    在Windows操作系统中,管理和分析进程线程资源的占用情况对于诊断系统性能问题至关重要。"查看线程资源占用工具"正是为了满足这一需求而设计的,它可以帮助用户深入了解系统中的进程,特别是找出那些占用大量资源的...

    C++ 线程函数是类的成员函数

    1. **定义成员函数**:首先,你需要定义一个成员函数,这个函数将在线程中运行。通常,这个函数会接受必要的参数,以便在运行时执行特定任务。 ```cpp class MyClass { public: void threadFunction(int arg); //...

    线程方法操作

    在编程领域,多线程是实现并发执行任务的关键技术,尤其在现代计算机系统中,它能够充分利用硬件资源,提高程序的执行效率。本教程将详细讲解多线程的基础操作,帮助初学者掌握这一核心概念。 1. **线程定义与用途*...

    多线程同步(多线程如何访问临界区资源)

    在编程领域,多线程是实现并发执行任务的有效手段,特别是在多核处理器系统中,能够充分利用硬件资源提高程序性能。然而,多线程环境下的资源共享往往伴随着数据竞争问题,这时就需要引入线程同步机制,以确保共享...

    易语言源码多线程类源码.rar

    在本压缩包“易语言源码多线程类源码.rar”中,包含了易语言编写的一个多线程类的源代码示例。多线程技术是现代软件开发中不可或缺的一部分,它允许程序同时执行多个任务,提高系统资源利用率,提升程序运行效率。 ...

    ListView避免多线程加载一个同一资源

    在这个新线程中,首先获取锁,然后检查`ConcurrentHashMap`中对应资源的状态。如果状态为`false`,表示当前没有其他线程在加载该资源,那么这个线程就可以开始加载工作。将资源状态更新为`true`,表示已经有线程在...

    实验4 线程编程实验.doc

    这是因为多个线程同时访问同一个资源时,可能会出现竞争和资源争夺的现象。 8. 线程的优点和缺点 线程的优点包括: * 提高系统的性能和效率 * 可以实现并发操作 * 可以实现异步执行 线程的缺点包括: * 需要...

    linux中一个程序的两个线程的同步(c语言实现)

    * 资源竞争:多个线程争夺同一个资源,可能会导致程序崩溃。 信号灯的概念 信号灯(Semaphore)是一种同步机制,用于控制多个线程访问共享资源的数量。信号灯可以设置一个初始值,表示可以访问资源的线程数量。当...

    多线程及线程同步

    在计算机编程中,多线程是一种让程序同时执行多个任务的技术,这极大地提高了应用程序的效率和响应速度。然而,多线程环境下也带来了一些问题,尤其是资源竞争和数据一致性问题,这些问题需要通过线程同步机制来解决...

Global site tag (gtag.js) - Google Analytics