`
齐晓威_518
  • 浏览: 607476 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

synchronized 和ThreadLocal 区别

 
阅读更多

看了N个贴子,ThreadLocal讲得都不是很清楚,纠缠与synchronized的区别。直到看了http://qqdwll.iteye.com/blog/685586 才清晰了ThreadLocal的作用。

 

ThreadLocal可以为每个线程维护自己的变量,对于多线程使用同一对象可以起到管理作用。

package com.koubei.Observable;

import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;

public class UserProcess implements Runnable{

    private UserDAO userDAO;
   
    public UserProcess(UserDAO userDAO){
        this.userDAO = userDAO;
    }
   
    public  void run() {
        // TODO Auto-generated method stub
        for(int i=0; i<1000; i++){
           
            userDAO.insertUser(getUser());
        }
    }

   
   
    public static void main(String[] args) {
        UserDAO userDAO = new UserDAO();
       
        new Thread(new UserProcess(userDAO)).start();
        new Thread(new UserProcess(userDAO)).start();
        new Thread(new UserProcess(userDAO)).start();
       
       
    }
}

Java代码

package com.koubei.Observable;

import java.sql.Connection;

public class UserDAO {

    private Connection conn = null;
   
    public UserDAO(){
       
    }
   
    public void insertUser(User user){
       
          getConn().prepareStatement(sql);
       
        //jdbc 操作
    }
   
    public synchronized Connection getConn(){
        if (conn == null) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                CONN = DriverManager.getConnection("jdbc:mysql://"
                        + DB_IP + ":" + "3306" + "/" + DB_NAME
                        + "?useUnicode=true&characterEncoding=gbk", DB_USER,
                        DB_PASSWORD);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return conn;
    }
}

在UserProcess中多个线程引用的同一个UserDAO,在线程运行后所有的语句都是通过一个Connection执行。

 

问题:

1、多个线程使用同一个conn效率比较低,存在数据共享问题。影响效率

 

改进:

1、希望UserDAO中为每个线程开立一个conn,各线程使用自己的连接执行sql

 

改进后的代码

package com.koubei.Observable;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class UserDAO {

    private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>();
   
   
    public UserDAO(){
       
    }
   
    public void insertUser(User user){
       
        getConnection().prepareStatement(sql);
       
        //jdbc 操作
    }
    
    public Connection getConnection(){  
        if (connThreadLocal.get() == null) {

            Connection conn = getConn();

            connThreadLocal.set(conn);

            return conn;

        }
       
        return connThreadLocal.get();

    }

   
   
    public synchronized  Connection getConn(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection("jdbc:mysql://"
                    + DB_IP + ":" + "3306" + "/" + DB_NAME
                    + "?useUnicode=true&characterEncoding=gbk", DB_USER,
                    DB_PASSWORD);
        }cache(SQLException e){
           e.printStackTrace();  
        }
        return null;
      
    }
}

改动后每个线程都会维护自己的conn,userDAO变成线程安全的。

 

 synchronized 是解决多个线程访问同一个变量

 ThreadLocal 是每个线程维护自己专用的变量

 两者使用场景不一样,作用也不一样。

分享到:
评论

相关推荐

    Synchronized与ThreadLocal

    Synchronized与ThreadLocal

    线程安全你还在用synchronized?

    你还在用synchronized?线程安全相关知识深入剖析

    多线程相关代码(V3)

    多线程相关的(具体包括Lock synchronized Join ThreadLocal Executors CountDownLatch等)一些demo。

    谈谈Java中的ThreadLocal

     需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了保证在多线程环境下对于共享资源的正确访问。而ThreadLocal从本质上讲,无非...

    Java多线程 之 临界区、ThreadLocal.docx

    synchronized关键字不属于方法特征签名的一部分,所以可以在覆盖方法的时候加上去。也就是说,在父类的方法声明上可以没有synchronized关键字,而在子类覆盖该方法时加上synchronized关键字。 注意:使用...

    Java并发编程学习笔记

    1、线程安全和锁 Synchronized 底层实现原理 2、可重入锁与 Synchronized 的其他特性 3、ThreadLocal 的底层实现与使用 4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层...

    java并发编程面试题

    synchronized 和 Lock 有什么区别? volatile 关键字的作用 # Lock体系 ## Lock简介与初识AQS ### Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势? ReentrantLock(重入锁)...

    Java中的线程同步与ThreadLocal无锁化线程封闭实现

    主要介绍了Java中的线程同步与ThreadLocal无锁化线程封闭实现,Synchronized关键字与ThreadLocal变量的使用是Java中线程控制的基础,需要的朋友可以参考下

    Java进阶教程,面试大全,包罗万象

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    Java进阶教程,面试大全

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    史上最全java面试,103项重点知识,带目录

    55. synchronized 和 ReentrantLock 区别是什么? 22 56. 说一下 atomic 的原理? 22 四、反射 23 57. 什么是反射? 23 58. 什么是 java 序列化?什么情况下需要序列化? 23 59. 动态代理是什么?有哪些应用? 23 60...

    java学习整理文档.docx

    java 学习整理文档 Spring框架并...使用ThreadLocal ,在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(以空间换时间”),为每一个线程都提供了一份变量,因此可以同时访问而互不影响

    Java并发编程相关技术使用案例

    线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的应用、Completablefuture的应用、手写阻塞队列、fork...

    史上最全的Java面试题集锦.pdf

    基本类型和包装类型的区别,涉及⾃动装箱和拆箱,怎么做的,原理 String ,StringBuffer,StringBuilder哪个是安全的 字符串编码的区别,被问到过,我觉得⽐较容易被忽视的⼀个点 什么是泛型,怎么⽤泛型 static能不...

    BATJ面试题汇总及详解65页

    BATJ面试题汇总及详解65页 JAVA面试题汇总 ...volatile、ThreadLocal的使用场景和原理? ThreadLocal什么时候会出现OOM的情况?为什么? synchronized、volatile区别? synchronized锁粒度、模拟死锁场景?

    Java常见面试题208道.docx

    55.synchronized 和 ReentrantLock 区别是什么? 56.说一下 atomic 的原理? 四、反射 57.什么是反射? 58.什么是 java 序列化?什么情况下需要序列化? 59.动态代理是什么?有哪些应用? 60.怎么实现动态代理? 五...

    蓝桥杯leetcode-JavaBase:Java一些类测试用例

    ArrayList和LinkedList的区别和删除时注意的点 7. Proxy 静态代理和动态代理 8. Reflection java 反射 9. Sort 多种排序方法 10. Sync synchronized 和 lock 的用法 11. Thread Thread创建、ThreadLocal用法、Deamon...

    百度地图毕业设计源码-interview-guide:面试指南

    1.7和1.8的区别,resize过程,多线程的问题 ConcurrentHashMap 1.7和1.8的区别 redis 保证缓存与数据库中数据一致性 数据类型 hash扩容 MySQL 索引 消息队列 如何保证消息的可靠性 分布式 分布式锁 分布式事务 redis...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

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

    4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗? 7.三大性质总结:原子性、可见性以及有序性 8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10....

Global site tag (gtag.js) - Google Analytics