`

2.并发讨论 — Java中多线程并发处理

阅读更多

 

2.并发讨论 — Java中多线程并发处理

 

synchronized关键字主要解决多线程共享数据同步问题。 

ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。

 

ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别:

 

synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。

ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。

Synchronized用于线程间的数据共享,ThreadLocal则用于线程间的数据隔离。

Synchronized用于实现同步机制,比ThreadLocal更加复杂。

 

1、java中synchronized用法 

 

使用了synchronized关键字可以轻松地解决多线程共享数据同步问题。

synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。  

       synchronized取得的锁都是对象;每个对象只有一个锁(lock)与之相关联;实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。 

 

synchronized的4种用法 :

1.方法声明时使用,线程获得的是成员锁. 

2.对某一代码块使用,synchronized后跟括号,括号里是变量,线程获得的是成员锁. 

3.synchronized后面括号里是一对象,此时,线程获得的是对象锁. 

4.synchronized后面括号里是类,此时,线程获得的是对象锁.

 

2、java.lang.ThreadLocal()的用法  

 

ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 

 

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。 

 

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

  

ThreadLocal() 

创建一个线程本地变量。 

 

T get() 

返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化此副本。 

 

protected T initialValue() 

返回此线程局部变量的当前线程的初始值。最多在每次访问线程来获得每个线程局部变量时调用此方法一次,即线程第一次使用 get() 方法访问变量的时候。如果线程先于 get 方法调用 set(T) 方法,则不会在线程中再调用 initialValue 方法。 

若该实现只返回 null;如果程序员希望将线程局部变量初始化为 null 以外的某个值,则必须为 ThreadLocal 创建子类,并重写此方法。通常,将使用匿名内部类。initialValue 的典型实现将调用一个适当的构造方法,并返回新构造的对象。 

 

void remove() 

移除此线程局部变量的值。这可能有助于减少线程局部变量的存储需求。如果再次访问此线程局部变量,那么在默认情况下它将拥有其 initialValue。 

 

void set(T value) 

将此线程局部变量的当前线程副本中的值设置为指定值。许多应用程序不需要这项功能,它们只依赖于 initialValue() 方法来设置线程局部变量的值。 

在程序中一般都重写initialValue方法,以给定一个特定的初始值。 

 

ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。 

 

ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。 

 

ThreadLocal不能使用原子类型,只能使用Object类型。ThreadLocal的使用比synchronized要简单得多。

 

 

ThreadLocal使用的一般步骤 

1、在多线程的类(如ThreadDemo类)中,创建一个ThreadLocal对象threadXxx,用来保存线程间需要隔离处理的对象xxx。 

2、在ThreadDemo类中,创建一个获取要隔离访问的数据的方法getXxx(),在方法中判断,若ThreadLocal对象为null时候,应该new()一个隔离访问类型的对象,并强制转换为要应用的类型。 

3、在ThreadDemo类的run()方法中,通过getXxx()方法获取要操作的数据,这样可以保证每个线程对应一个数据对象,在任何时刻都操作的是这个对象。

 

分享到:
评论

相关推荐

    Java 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    java 多线程并发实例

    代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!

    Java 并发性和多线程

    Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程

    java多线程并发

    java多线程并发的在新窗口

    Java多线程与并发库高级应用

    并发库高级应用\多线程\Java

    java多线程处理数据库数据

    java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。

    Java_多线程与并发编程总结.doc

    对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同...

    Java 高并发多线程编程系列案例代码

    Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    java多线程与高并发视频

    java多线程与高并发java多线程与高并发java多线程与高并发

    JAVA多线程并发操作全局变量

    NULL 博文链接:https://toknowme.iteye.com/blog/2212529

    java多线程并发演示

    实现多线程的并发执行,能演示操作系统的时间转轮调度算法对多线程程序执行的影响效果,能控制一个或多个线程的执行情况。

    高并发多线程处理demo-java.rar

    这个是一个java开发的多线程高并发实例,一个真正实现并发队列接收,多线程处理的程序,完整实例,可以使用JMETER性能测试工具测试

    java多线程查询数据库

    java多线程并发查询数据库,使用线程池控制分页,并发查询。

    JAVA并发多线程的面试问题及答案-java多线程并发面试题.docx

    线程间交互是 Java 多线程并发编程中非常重要的一方面。面试官通常会问一些相关的问题,以检测候选者的基础知识和实际编程能力。 * wait 和 sleep 方法的不同? 这个问题是检测候选者对 wait 和 sleep 方法的理解和...

    JAVA实现多线程并发机制

    用JAVA实现多线程并发机制 且可以实现多功能

    JAVA多线程与并发学习总结.pdf

    JAVA多线程与并发学习总结 本文总结了JAVA多线程与并发的相关知识点,涵盖计算机系统的高速缓存机制、JAVA内存模型、内存间交互操作、volatile型变量、原子性、可见性与有序性、先行发生原则等内容。 计算机系统...

    java多线程并发控制[参照].pdf

    java多线程并发控制[参照].pdf

    java socket 多线程并发控制 hibernate mysql

    java多线程并发控制通信,用hibernate存储信息,数据库mysql.

    java FTP多线程 批量 断点续传

    java FTP多线程 批量 断点续传,使用 1.建一个支持多线程FTP服务端; 如:xxftp有Windows和Linux版本; 2.建一个项目导入文件测试;

Global site tag (gtag.js) - Google Analytics