一个JAVA单例模式的典型错误应用的分析和解决方法
来源:互联网 发布:linux用ftp上传文件 编辑:程序博客网 时间:2024/06/03 20:54
问题来自论坛,
http://topic.csdn.net/u/20090927/23/497372f4-af98-4b7b-8489-3eb3a8de43b5.html
其代码如下:
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import com.cfd.drp.utils.Utils;
- public class ClientManager {
- // 此处使用了实例级的属性
- StringBuffer sb = new StringBuffer();
- // 此处实现了单例模式
- private static ClientManager manager = new ClientManager();
- private ClientManager() {
- }
- public static ClientManager getInstance() {
- return manager;
- }
- // 这里没有同步,多个线程将同时调用这个方法
- public String showTree() {
- Connection connection = null;
- sb.delete(0, sb.length());
- try {
- connection = Utils.getConnection();
- tree(connection, 0, 1);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- Utils.close(connection);
- }
- return sb.toString();
- }
- public void tree(Connection connection, int id, int level) throws SQLException {
- String sql = "select * from t_client where pid = ?";
- int i = 0;
- PreparedStatement ps = null;
- ResultSet rs = null;
- try {
- ps = connection.prepareStatement(sql);
- ps.setInt(1, id);
- rs = ps.executeQuery();
- while (rs.next()) {
- sb.append(rs.getString("name") + "<br>" + "/n");
- if (rs.getString("is_leaf").equals("N")) {
- tree(connection, rs.getInt("id"), level);
- }
- }
- } finally {
- Utils.slose(rs);
- Utils.close(ps);
- }
- }
- }
具体的错误我已经在代码里标注出来了。
单例,就是系统只有一份实例,那么多个线程使用这一个实例,当然也就同时使用这一个StringBuffer了。
大家一起胡乱的往里面倾倒垃圾,怎么可能不混乱呢!
解决方法就是将StringBuffer做成局部变量
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import com.cfd.drp.utils.Utils;
- public class ClientManager {
- // 此处实现了单例模式
- private static ClientManager manager = new ClientManager();
- private ClientManager() {
- }
- public static ClientManager getInstance() {
- return manager;
- }
- // 这里没有同步,多个线程将同时调用这个方法
- public String showTree() {
- // 此处使用局部变量
- StringBuffer sb = new StringBuffer();
- Connection connection = null;
- try {
- connection = Utils.getConnection();
- tree(connection, 0, 1, sb); // 作为参数调用
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- Utils.close(connection);
- }
- return sb.toString();
- }
- public void tree(Connection connection, int id, int level, StringBuffer sb) throws SQLException {
- String sql = "select * from t_client where pid = ?";
- int i = 0;
- PreparedStatement ps = null;
- ResultSet rs = null;
- try {
- ps = connection.prepareStatement(sql);
- ps.setInt(1, id);
- rs = ps.executeQuery();
- while (rs.next()) {
- sb.append(rs.getString("name") + "<br>" + "/n");
- if (rs.getString("is_leaf").equals("N")) {
- tree(connection, rs.getInt("id"), level,sb);
- }
- }
- } finally {
- Utils.slose(rs);
- Utils.close(ps);
- }
- }
- }
0 0
- 一个JAVA单例模式的典型错误应用的分析和解决方法
- 一个JAVA单例模式的典型错误应用的分析和解决方法
- 一个典型的事务使用错误分析
- 一个典型的Java程序分析
- Java static的应用练习和单例模式
- 对于Java单例设计模式的总结和分析
- Linux下安装ArcSDE的一种典型错误和解决方法
- Java单例模式的应用示例
- 一个典型的Struts2错误
- 单例模式的写法和应用
- java单例模式的一个小结
- 策略模式的典型应用
- 一个典型的$.ajax应用
- HMAC的一个典型应用
- 一个典型代码的分析
- 论Java WEB应用中最基本的单表增删改查的实现和及相关错误模式
- 单例模式常见的应用场景分析
- Java中典型的内存泄露问题和解决方法
- 关于.Net与J2EE的比较,到底用微软平台还是Java平台的问题
- Hadoop HDFS FileSystem详解
- ModelAndView
- CODEVS_2144 砝码称重 2 折半搜索+二分查找+哈希
- 跨服务器登录验证(单点登录SSO)的过程和Java实现
- 一个JAVA单例模式的典型错误应用的分析和解决方法
- jquery.cookie用法
- JAVA人正式上线(JavaRen.org)关注JAVA项目经验和实战
- 树与二叉树
- XML 做小型数据库
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API
- 【网络流】 POJ 1273 Drainage Ditches
- 精选30道Java笔试题解答
- tiffany collane