借用容器类实现网站购物程序的过程,封装商品类、购物车类,以及模拟购物的测试程序。
这种只能写一个测试代码给你看,要求太少,你要想彻底学会,找个项目跟着练练,光一个ide可是没啥用的,
业余看看:https://blog.csdn.net/m0_63512120/article/details/129108284
import java.util.ArrayList;
import java.util.List;
class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
class ShoppingCart {
private List<Product> products;
public ShoppingCart() {
products = new ArrayList<Product>();
}
public void addProduct(Product product) {
products.add(product);
}
public void removeProduct(Product product) {
products.remove(product);
}
public double getTotalPrice() {
double totalPrice = 0;
for(Product product : products) {
totalPrice += product.getPrice();
}
return totalPrice;
}
}
public class ShoppingTest {
public static void main(String[] args) {
Product p1 = new Product("WINDOWS", 16999);
Product p2 = new Product("iPad", 7800);
Product p3 = new Product("HUAWEI", 9999);
ShoppingCart cart = new ShoppingCart();
cart.addProduct(p1);
cart.addProduct(p2);
cart.addProduct(p3);
System.out.println("Total price: " + cart.getTotalPrice());
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:若事务T对数据对象A加上X锁,则其他事务在T释放A上的锁之前不能再对数据A上锁。倘若,事务T2中没有上任何锁,那么它是可以直接读取和修改数据A的。因此,并不是说,事务T对数据A上X锁到释放X锁期间,其他事务就不能访问数据A。
但是,如果选择了封锁协议,情况就不一样了。譬如选择了使用一级封锁协议,那么根据一级封锁协议规定,事务T在修改数据R之前必须先对其进行加X锁,直到事务T结束才释放。也就是说,如果一个事务中有修改数据的操作,那么它必须先对该数据上X锁,才能进行修改操作。
如此,在一级封锁协议下,若事务T对数据对象A加上X锁,则其他事务在T释放A上的锁之前不能再对数据A上锁,因此也就没有机会去修改数据A了。
但是,要注意的是,一级封锁协议规定的是:“事务T在修改数据R之前必须先对其进行加X锁,直到事务T结束才释放。”它对读取数据没有作规定啊。因此,在一级封锁协议下,如果一个事务只有读取数据A的操作,那么即使数据A被上了X锁,那也没影响,照样可以读取。
也正是因为一级封锁协议下,读取操作是不受限制的。因此,一级封锁协议协议没能解决脏读和不可重复读的问题。举例来说,事务a执行了更新操作,将记录为(1,‘a’)的记录改成了(1,‘b’),这时事务b执行了查询操作,查询到这条记录是(1,‘b’)。但是事务a回滚了,该记录变回了(1,‘a’)。如此,事务b读到的(1,‘b’)就是不存在的记录,这就是脏读。而不可重复读呢,如果事务a执行了查询操作,读到的是(1,‘a’),然后这时事务b执行了更新操作,将记录为(1,‘a’)的记录改成了(1,‘b’),这时事务a进行验算操作,再查询一次,发现记录变成了(1,‘b’)。也就是说,事务a两次读取的记录是不一样,这就是不可重复读问题(重复读取结果却不一样,这就是不可重复读问题)。
可能我的表述还是没那么清晰,没关系,继续往下看,看了二级封锁协议和三级封锁协议就懂了。