JavaWeb关于高并发,线程,同步化,堆与栈的各类问题
Synchronized同步化的四种方法!
对于同步化,有几点需要声明以便理解:类是被声明的,对象是按照类的具体声明来决定怎样被创建.每个对象都是拥有一把锁的!在多线程对同一对象进行操作的情况下,这把锁的获取权,将会被各个线程锁争夺,唯有获取了该对象的锁,才能对该对象进行操作!
假定现在有一个类:public class Account 代表账户
声明如下:
public class Account {
private int balance; //代表余额
private String name; //用户的姓名
public int deposit (int count){ //入账,存入金额
this.balance += count;
return this.balance;
}
public int chargeoff(int count){ //出账,取出金额
this.balance -= count;
return this.balance;
}
//setter and getter
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对象(Object)的同步化:
例如:我们在其他的类中填写代码的时候要使用到Account这个类,来操作用户的账户.
假设这个类是public class Operation
public class Operation {
public static void operate(count1, count2){
Account a1 = new Account();
Account a2 = new Account();
synchronized(a1){
a1.deposit(count1);
a1.chargeoff(count2);
}
a2.deposit(count1);
a2.chargeoff(count2);
}
}
如果想要使用Operation这个类,执行对两个账户a1,a2的修改,那么锁住对象变得很关键了.
在实际环境中,若果对a1或者a2两个变量在一小段时间内,同时多线程操作,那么thread-1和thread-2获取的balance很可能是一样的,这样一来,在thread-1还没有操作完毕之后