0 0

关于java线程的锁的问题。 0

private static Object lock = new Object();
...
public void run(){
	while(true){
		synchronized(lock){
			List<myObject> datas = dao.getDatas();
			for(myObject data : datas){
				myThread thread = new myThread();		    		
				thread.start();		    	
			}
		}
	}
}
public class myThread extends Thread{
	public void run(){   
		synchronized(xxx){
			//do something									
		}
	}							
}



在XXX处,应该怎么写,才能让线程针对每个myObject对象获取锁。
比如说List<myObject> datas = dao.getDatas()从数据库中获取到2个对象,
data1,data2,可以有两个线程运行  do something  代码块。
当有新的线程时,判断要针对哪个对象,并判断是否有针对该对象的线程正在运行。
如果有则等待,否则继续等待。

问题补充:场景是: 每个myObject对象是一个数据库服务器,我的程序是定时从这些数据库服务器拉取相关数据,所以,myObject对象不会太多,并且每次从dao.getDatas()返回的对象值是不会变的,但是对象的标识(就是对象的内存地址)是会变的,因为每次dao.getDatas都是重新构造对象。
2014年5月12日 11:49

4个答案 按时间排序 按投票排序

0 0

你的这个

引用
dao.getDatas();
是有其它线程在改变吗?
场景没太看明白,是想一边修改Data,另一边遍历吗?
这种场景可以使用CopyOnWriteArrayList,该容器不需要加锁,可以方便的遍历,同时没有ConcurrentModification异常。

2014年5月12日 13:50
0 0

如果你能保证dao.getDatas()返回的对象是不会变的,则可以直接对myObject对象进行加锁。

如果不能保证,则需要一个映射机制,让每个myObject对象能对应一把锁,然后对那把锁进行同步。

不过最好是把你的场景描述更清楚一些,这样才能更好的分析问题,并且从你现在的方案来说,每个myObject起一个线程的使用场景可能会有问题,那就是当myObject会有很多对象的时候,就会起大量的线程,这个可能会造成应用的性能问题。一个应用最好不要起太多的线程,如果一件事情需要多线程做的话,可以尝试使用线程池,以及任务调度的方式来工作,而不是每一份工作都需要起一个新线程。

2014年5月12日 12:46
0 0

Thread永远是新的对象,所以永远无法达到锁方法的要求 解决办法如下

在外面写一个加锁的外部方法如  public synchronized void test(){} 然后在run方法中调用 test()

2014年5月12日 12:14
0 0

1.List<myObject> datas = dao.getDatas();
如果这句能保证每次获取到不同的数据,则这里不用在线程中再加锁。

2.如果非要加锁,则:
public class myThread extends Thread{
  myobject obj;
 
  public void setObj(myobject obj){
    this.obj = obj;
  }
}

调用前,将obj设置进去,这样可以满足你目前的需要,但首先再验证下1.

2014年5月12日 12:03

相关推荐

    4种常用Java线程锁的特点,性能比较、使用场景.pdf

    4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...

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

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java多线程之并发锁

    Java 中的多线程编程需要充分考虑线程安全和锁机制的问题,否则可能会导致程序的执行不稳定和崩溃。Lock 机制是 Java 中的一种重要的线程同步机制,它可以用来实现线程安全和提高程序的执行效率。

    java线程.pdf

    根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的...

    关于线程(java)两天的课件

    Java线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。这些状态之间的转换是通过调用特定的方法,如start()、sleep()、join()、wait()、notify()等...

    java多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

    java多线程的条件对象和锁对象demo

    本示例"java多线程的条件对象和锁对象demo"着重探讨了如何利用锁对象和条件对象来精细控制线程的执行流程。 首先,我们需要了解Java中的锁对象。Java提供了多种类型的锁,其中最基础的是`synchronized`关键字,它...

    java多线程、锁的教程跟案例

    `多线程.docx`可能是关于Java多线程的深入讲解,涵盖线程安全、线程同步、锁的使用等方面。 总之,理解并熟练掌握Java多线程和锁机制对于编写高效、健壮的并发代码至关重要。通过实践和案例学习,可以更好地理解...

    JAVA单线程多线程

    通过以上分析,我们可以看到,在Java中合理利用单线程或多线程以及`synchronized`关键字能够有效地提高程序的性能和响应能力,同时也需要注意其可能带来的复杂性和资源消耗问题。开发者应根据具体的应用场景和需求来...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而...在"线程池.rar"和"线程实例"这两个文件中,你可以找到关于这些概念的具体示例代码,通过学习和实践,可以深入理解Java线程的运用和管理。

    java线程深入解析

    本文将深入解析Java线程的相关知识点,包括线程的定义、创建、状态管理、线程同步和安全问题。 1. **线程定义** 在Java中,线程是进程中的单一顺序控制流,是程序执行的基本单元。线程在进程的上下文中运行,共享...

    java线程文档大全

    这份“java线程文档大全”包含了关于Java线程的广泛知识,以下是其中的一些关键点: 1. **线程概念**:线程是程序执行的最小单位,每个线程都有自己的程序计数器、寄存器和局部变量,共享同一块内存空间。在Java中...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...

    java 多线程synchronized互斥锁demo

    标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...

    java线程.rar

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...

    多线程的使用与线程锁的两种实现

    本主题将深入探讨多线程的使用以及线程锁的两种主要实现方式: synchronized关键字和ReentrantLock。 一、多线程基础 1. 线程创建: - 继承Thread类:创建一个新的类,该类继承自Thread类,并重写run()方法。然后...

    java多线程经典案例

    同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的行为。在实际开发中,合理运用线程同步和通信机制,能够提高系统的响应速度和并发处理能力,提升软件的用户体验。

    java线程与并发编程实践

    本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,提供了关于Java线程API和并发工具的详细指南,帮助开发者深入理解和应用这些关键概念。 首先,Java线程是程序执行的独立路径,每个线程都有自己...

    Java线程学习和总结

    本文档("Java线程学习和总结.htm")可能包含了更多关于线程的实例、源码分析和常见问题解决方案,你可以通过阅读来进一步加深对Java线程的理解。同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的...

Global site tag (gtag.js) - Google Analytics