synchronized 和ThreadLocal 差异ITeye - 超凡娱乐

synchronized 和ThreadLocal 差异ITeye

2019-01-14 05:07:13 | 作者: 旭东 | 标签: 线程,每个,自己 | 浏览: 2355

看了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 是每个线程保护自己专用的变量

 两者运用场景不一样,效果也不一样。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    PHP多态ITeye

    多态,目标,不同
  • 2
  • 3
  • 4

    调用体系程序(转)ITeye

    进程,咱们,程序
  • 5
  • 6

    puttyITeye

    保存,用户名,暗码
  • 7

    1001ITeye

    小数点,个数,位数
  • 8
  • 9
  • 10

    vim装备ITeye

    文件,设置,状况