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

同一代码多线程并发的混乱情况

 
阅读更多
public class Thread1 extends Thread {
	private static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>();

	public static Session getSession() {
		Session s = threadSession.get();
		if (s == null) {
			System.out.println("s==null");
			s = new Session();
			threadSession.set(s);

		} else {
			System.out.println(s.getId());
		}
		return s;
	}

	public void run() {
		for (int i = 0; i < 3; i++) {
			Session s = getSession();
		}
	}

}


public class ThreadLocalTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Thread1 t1=new Thread1();
		Thread1 t2=new Thread1();
		
		try {
			t1.start();
			//t1.join();
			t2.start();
			//t2.join();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/*t1.start();
		t2.start();*/
	}

}


public class Session {
	private static AtomicLong id=new AtomicLong(0);
	
	Session(){
		System.out.println("haha:"+id.incrementAndGet());
	}
	
	public long getId(){
		return id.get();
	}
}



打印出的结果:

s==null
s==null
haha:1
haha:2
2
2
2
2

这是什么原因造成的?分析后发现第二个线程threadSession.set(s);
时把第一个线程的session set进去了,这就说明在执行getSession()方法时,是在同一内存区操作的,若不进行同步,getSession()方法内的变量在各个线程之间是公用的数据。
分享到:
评论
3 楼 jaedong 2012-01-12  
不如果想要这种结果只能让第一个线程制行完
td1Session is null
id=1
1
1
td2Session is null
id=2
2
2


加了synchronized还是你上边的结果,主要还是AotmicLong是全局类型.
2 楼 bjmike 2012-01-12  
jaedong 写道
AtomicLong是static类型的,加了synchronized还是这种效果

我以前测过,是在getSession上进行同步控制,你可以测试一下,如果我没记错的话,效果是不一样的。
1 楼 jaedong 2012-01-12  
AtomicLong是static类型的,加了synchronized还是这种效果

相关推荐

    C#使用读写锁三行代码简单解决多线程并发的问题

    在C#编程中,多线程并发访问同一资源时,特别是在进行文件操作时,可能会遇到“文件正在由另一进程使用,因此该进程无法访问此文件”的错误。为了解决这个问题,我们可以利用C#中的读写锁(ReaderWriterLockSlim)来...

    C++ 并发多线程日志处理

    在C++编程中,多线程日志处理是一项重要的任务,尤其在高并发环境中,能够有效地记录、管理和分析系统运行时的信息。C++11引入了标准库中的`&lt;thread&gt;`,使得多线程编程变得更加方便,同时也为日志处理带来了新的挑战...

    java实现多线程文件传输

    10. **安全性**:在多线程环境下,文件操作需注意文件锁,避免同一时刻多个线程修改同一文件,造成数据混乱。 通过以上知识点的综合运用,我们可以构建一个高效、安全的多线程文件传输系统。实际编程中,还需要根据...

    多线程通信读写文件

    在编程领域,多线程通信是提升程序效率和并发能力的重要技术。特别是在处理大量数据时,如读写文件,多线程可以同时执行不同的任务,从而显著提高整体性能。本项目着重探讨如何在多线程环境中实现安全有效的文件读写...

    g729a 支持多线程

    虽然描述中没有明确提及,但实现多线程G729A时,可能已经考虑了适当的同步策略,以避免因并发操作导致的数据混乱。 6. **性能优化**: 除了线程安全外,优化多线程G729A的性能也是关键。这可能涉及到线程池的使用...

    辽宁多线程

    4. **同步与互斥**:多线程环境下,数据共享是常见的问题,辽宁多线程V1.3可能采用了锁、信号量等机制来保证数据的一致性和完整性,防止多个线程同时访问同一资源导致的数据混乱。 5. **异常处理**:在多线程编程中...

    C#多线程List的非线程安全性

    标题中提到的“List添加对象的误区”主要体现在多线程环境下对List&lt;T&gt;.Add()方法的并发调用。 当一个线程正在执行List&lt;T&gt;.Add()操作时,List可能会进行容量扩展以容纳新的元素。这个扩展过程涉及到创建新的数组,将...

    java多线程简单下载器

    【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...

    多线程同步大量数据转录的多线程和同步

    标题与描述均提到了“多线程同步大量数据转录”的概念,这涉及到在计算机科学领域中的并发编程技术,特别是如何有效地处理大规模数据集的转录工作。在现代软件开发中,多线程同步机制是优化性能、提高系统吞吐量的...

    为什么说多线程是鸡肋?神级程序员带你真正熟练使用多线程!.docx

    Python的多线程在单核CPU下表现得相对较好,因为所有线程轮流执行,虽然看似并发,但实际上是交替执行。在多核CPU上,由于GIL的存在,Python的多线程并不能充分利用多核优势。GIL是为了确保在解释器层面的线程安全,...

    多线程下载demo

    这一步通常需要考虑文件的同步问题,避免因多线程写入同一位置导致的数据混乱。可以使用`synchronized`关键字或锁机制来确保安全的文件写入。 5. **进度更新**:在下载过程中,可以计算已下载数据的百分比,用于展示...

    Globle Get 多线程下载系统

    《Globle Get 多线程下载系统:深入解析与应用》 在互联网技术日新月异的今天,高效的数据传输成为了提升用户体验的关键因素之一。Globle Get 多线程下载系统,作为一款旨在优化文件下载速度的工具,通过利用多线程...

    python多线程同步之文件读写控制

    在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...

    Java 多线程 订票 示例 线程安全

    线程安全是指当多个线程访问同一代码块时,即使这些线程是并发执行的,程序也能保持其正确性,即不会出现数据混乱或丢失的情况。在Java中,实现线程安全的方法通常包括同步机制(synchronized关键字)、volatile变量...

    多线程数据同步

    在多线程编程中,数据同步是一个至关重要的概念,它涉及到如何确保多个线程在并发访问共享资源时能正确地协调工作,避免数据竞争和不一致的状态。标题"多线程数据同步"直指这一核心问题,而描述则具体提到了使用临界...

    多线程_生产消费模型

    总结来说,Windows多线程环境下的生产者-消费者模型通过关键代码段和互斥量实现线程同步,有效地解决了并发访问共享资源的问题。关键代码段适用于同一进程内的线程同步,而互斥量则可跨越进程边界,保证全局资源的...

    多线程文件传输系统的实现

    在多线程环境中,为了确保线程安全,可能需要使用互斥量(mutex)或信号量(semaphore)等同步机制来防止多个线程同时访问同一文件导致的数据混乱。 网络Socket是实现跨网络通信的关键组件。在Windows中,使用...

    Thread类&java多线程(代码篇).pdf

    Java中的多线程是程序设计中的重要概念,特别是在并发编程中。`Thread`类是Java提供的用于实现线程操作的基础类,它位于`java.lang`包中。在Java中,创建和管理线程通常有两种方式:一是继承`Thread`类,二是实现`...

    多线程应用程序

    在编程领域,多线程是实现并发执行任务的一种关键技术,尤其在现代计算机系统中,它已经成为提高程序效率、提升用户体验的重要手段。这个“多线程应用程序”学习示例旨在帮助初学者理解并掌握多线程的基本概念和使用...

    servlet多线程

    这种设计允许同一Servlet的`service`方法在多线程环境中并发执行,极大地提高了Servlet的并发处理能力和响应速度。例如,在Apache Tomcat服务器中,可以通过配置`server.xml`文件中的`&lt;Connector&gt;`元素来设定线程池...

Global site tag (gtag.js) - Google Analytics