孙鑫老师的JSP深入详解第9章的购物车例子中CartBean.java表示购物车,提供了增加、删除购物车条目、计算价格等的功能。package com.jin.ch09.sportsreading;import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import com.jin.ch09.sportsreading.FloatOperation;public class CartBean implements Serializable {

private HashMap<Integer, CartItemBean> items = null;


public CartBean() {
items = new HashMap<Integer, CartItemBean>();
}

public synchronized void deleteItem(Integer bookId) {

if(items.containsKey(bookId)) {
items.remove(bookId);
}

}

public synchronized void clear() {
items.clear();
}


public synchronized int getNumofItems() {
return items.size();
}


public synchronized float getTotalPrice() {
float totalPrice = 0;
    Collection<CartItemBean> c = items.values();
    Iterator<CartItemBean> it = c.iterator();
    while(it.hasNext()) {
     CartItemBean item = it.next();
     float itemPrice = item.getItemPrice();
     totalPrice = FloatOperation.add(totalPrice,itemPrice);
    }
    return totalPrice;
}


public synchronized boolean isExist(Integer bookId) {
if(items.containsKey(bookId)) {
return true;
} else {
return false;
}
}

}请问为什么在购物车CartBean里的每个方法都加synchronized呢?我懂synchrozied的意思,但这里不知道为什么要进行同步.
CartBean是作为session使用的,每个用户都拥有自己的CartBean对象,为什么还要在其中方法上加同步锁呢?

解决方案 »

  1.   

    恩,这段代码我也看过。
    我自己看的也是他的书。
    你一说我到确实觉得是一个疑问,个人觉得可能是一个好的习惯吧,这样的习惯可以最大程度上杜绝bug的存在。
      

  2.   

    这里应该加入同步锁,否则如果用户点击速度太快了,连续点击了两次添加、删除按钮时,就有可能同时进入add或者delete方法中了虽然这个可能性不大,但是总是一个隐藏的问题
      

  3.   

    良好的编程习惯
    同意11楼
    这种写法,可彻底杜绝BUG