- 浏览: 123616 次
- 性别:
- 来自: 地球
文章分类
最新评论
-
754731046:
很适合对初学者适用,谢谢
Oracle存储过程详解 -
天明破晓:
我测试了,不好用
Java中的正则表达式验证各种电话号码 -
OracleX:
otom31 写道从来不用标签库,几乎不用struts,除了最 ...
标签库的优点、缺点大辩论 -
otom31:
从来不用标签库,几乎不用struts,除了最早公司要使用以外; ...
标签库的优点、缺点大辩论
基本的ThreadLocal使用
public class ThreadLocalTest { static ThreadLocal tl=new ThreadLocal(); public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data =new Random().nextInt(); public void run() { System.out.println(Thread.currentThread().getName()+"存入的数据是 "+data); tl.set(data); //存到了当前线程 new A().getThreadData(); } }).start(); } } static class A{ //静态类相当于一个外部类 public void getThreadData(){ System.out.println("data is "+tl.get()); } } }
结果可能是
Thread-0存入的数据是 1997234255
Thread-1存入的数据是 267171693
data is 1997234255
data is 267171693
通过包装对象非常烂的使用方式
class MyThreadScopeData{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class ThreadLocalTest { static ThreadLocal<MyThreadScopeData> myThreadScopeData=
new ThreadLocal<MyThreadScopeData>(); public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data =new Random().nextInt(); public void run() { MyThreadScopeData mydata=new MyThreadScopeData(); mydata.setName("name is name"+data); mydata.setAge(data); //把对象存入ThreadLocal 这样的做法非常烂!!!!! myThreadScopeData.set(mydata);
new B().showThreadScopeData(); } }).start(); } } static class B{ public void showThreadScopeData(){ System.out.println(myThreadScopeData.get().getName()); System.out.println("age is "+myThreadScopeData.get().getAge()); } } } }
标准使用方式
/** * 单列线程 * 在线程中范围内任意地方调,得到都是同一个实例对象 * 把ThreadLocal封装到单列的内部 */ class ThreadSingle{ private ThreadSingle(){} public static ThreadLocal<ThreadSingle> map=new ThreadLocal<ThreadSingle>(); //不需要加synchronized,即便有第2个线程进入,但拿到的map.get()是独有的。 public static ThreadSingle getThreadInstance(){ //方法得到是与本线程相关的实例 ThreadSingle obj=map.get(); /** * 如果A进入时obj=null,刚创建完还没赋值,此时B线程进入,但B和A没有关系。 */ if(obj==null){ obj=new ThreadSingle(); map.set(obj); } return obj; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class ThreadLocalTest { public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data =new Random().nextInt(); public void run() { ThreadSingle.getThreadInstance().setName("name"+data); ThreadSingle.getThreadInstance().setAge(data); new C().showData(); } }).start(); } }
发表评论
-
AOP的实现(JDK动态代理)
2011-11-29 16:21 1004转自:http://www.blogjava.net/D ... -
Java 枚举7常见种用法
2011-11-27 22:54 891转自:http://helloyesyes.itey ... -
一个Java程序员应该掌握的10项技能
2011-11-18 11:57 10161、语法:必须比 ... -
Java回调函数使用
2011-08-16 16:14 719正常情况下开发人员使用已经定义好的API,这个过程叫 ... -
为什么要设置Java环境变量(详解)
2011-08-17 21:40 682从大二开始接触Java,之后是断断续续的学习。大三真正开始 ... -
很长空格的String转换成Array数组
2011-08-23 14:40 1298开发中碰到了一个需求,需要把键值对字符串分隔,但键值之 ... -
不同格式的日期字符串转换
2011-08-23 14:44 956先把字符串日期转换成对应的格式,然后再转换成日期 p ... -
用序列化(Serializable)保存、读取对象
2011-08-23 15:33 870实现Serializable借口的对象可以被转换成一系列 ... -
JUint测试
2011-08-23 15:36 659ClassA.java public class Cla ... -
解决Join方法的疑惑
2011-08-23 20:57 1012很长时间对join方法感到疑惑,不明白到底是谁要阻塞,谁要继 ... -
线程学习笔记【1】----进程、线程概念及创建线程
2011-08-27 22:33 8061.进程与线程 每个进程都独享一块内存空间,一个应用程 ... -
线程学习笔记【2】---Timer(定时器)
2011-08-28 09:15 781入门 public class Time01 { ... -
线程学习笔记【3】---互斥技术
2011-08-29 15:10 752第一个示例更多的是运用了内部类的特性: 内部类重要特点:可以 ... -
线程学习笔记【4】---线程之间通信
2011-08-29 17:31 751子线程先循环10次,然后主线程循环100次,再子线程循环10次 ... -
各种创建单例模式的优缺点
2011-09-05 21:54 831单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全 ... -
格式化简单例子
2011-11-04 16:35 821参考:http://android.blog.51cto.co ... -
图片上传源码(commons-fileupload-1.2.2)分析
2011-11-03 11:20 2060题记:文章是供自己查看方便,所以没有进行格式化,请见谅 ... -
用序列化(Serializable)保存、读取对象
2011-08-23 15:56 922实现Serializable借口的对象可以被转换成一系 ... -
IO各种流使用清晰区别
2011-08-10 11:39 844引用:http://www.iteye.com/topic/1 ... -
创建File和Properties
2011-08-08 10:03 736package com.file; import ...
相关推荐
在本文中,我们将深入探讨Java多线程的相关知识点,并结合提供的源代码进行学习。 1. **线程的创建** - **实现Runnable接口**:创建一个类实现Runnable接口,然后将其实例传递给Thread类的构造函数,如`Thread t =...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
本篇笔记将深入探讨Java中的并发同步机制,包括核心概念、工具类以及在实际开发中的应用。 首先,我们要理解什么是线程安全。线程安全是指在多线程环境下,一个方法或类能够正确处理多个线程同时访问的情况,不会...
- `HttpClient学习笔记.doc`: 可能包含了关于Apache HttpClient的使用教程,包括如何创建HTTP请求,执行GET和POST操作,以及设置请求头和处理响应等内容。 - `HTTP中Get与Post的区别.doc`: 深入解析HTTP协议中的GET...
5. **ThreadLocal**:为每个线程提供独立的变量副本,避免线程间的共享,从而实现线程安全。 基于HTTP协议的断点续传功能在文件下载中非常常见。它允许用户在中断下载后从上次停止的位置继续,而不是重新开始。在...
Java多线程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提高..."Java多线程源码笔记.pdf"这样的文档通常会涵盖以上内容,并可能包含具体的源码分析和实战案例,对于理解和掌握Java多线程编程非常有帮助。
这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率。在Java中,实现多线程主要有两种方式:通过继承Thread类和实现...通过深入学习和实践,你可以构建出更加健壮和高性能的并发应用。
{14.3.1}SAX应用}{206}{subsection.14.3.1} {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{...
在Java编程领域,无锁编程是一种高级的并发控制技术,旨在提高多线程环境下的程序性能和可伸缩...学习这些内容,有助于开发者深入理解Java并发编程,提升在多线程环境下的编程能力,从而设计出更加高效、可扩展的系统。
- 线程封闭(Thread Confinement):一种确保线程安全的策略,通常通过ThreadLocal等机制实现。 - 不可变对象(Immutable Objects):一旦创建就不能被修改的对象,天然线程安全。 学习Java并发编程,重点在于理解...
本学习笔记将深入探讨JUC的基础知识,帮助你理解和掌握Java并发编程的核心概念。 在Java中,多线程是实现并发的主要方式。一个线程是程序执行的一个流,多线程则意味着一个程序内可以同时执行多个线程。Java提供了...
### JavaSE基础学习笔记 #### 一、Java概述与历史 - **起源与发展**:Java最初由Sun Microsystems在1995年推出,后被Oracle公司收购并继续发展。Java经历了多个版本的发展,逐渐形成了Java SE(Standard Edition,...
- **ThreadLocal** 提供线程局部变量,每个线程有自己的副本,互不影响。 9. **并发编程模式** - 生产者消费者模式:使用队列作为缓冲区,生产者生产数据,消费者消费数据。 - 管道模式:通过管道连接多个进程或...
框架通过在框架线程中调用应用程序代码将并发性引入应用程序,因此对线程安全的需求在整个应用程序中都需要考虑 基础知识 线程安全性 定义 当多个线程访问某个类时,这个类始终能表现出正确的行为,...