JAVA线程的特性是切换执行,很有可能该语句执行一半就切换时间片了,所以容易出现很多安全问题
为了避免这一问题,我们在多线程访问公共资源的时候应该考虑使用同步块或同步方法;
同步块
synchronized(object){
}
这个同板块内的内容一段时间内只能执行一次,第一个执行到的会锁上,接下来执行到的必须等解锁后才能执行。
例如int a=10;
new Thread(){
Object obj;
synchronized(obj){//这里obj也可以替换成当前类或者参数
a++;
sleep(100000);//省略异常处理
}
}.start();
线程开启多个后,a并不会疯狂++;而是每隔大约100000ms加一次,因为第一个线程把同步块锁住之后休眠了,而其他线程必须等待解锁才能执行
同步方法
同步方法和同步块类似,把整个方法视作在一个同步块内
单例模式
同步方法和同步块常常用于单例模式,单例模式就是指整个程序唯一的一个
分为懒汉模式和饿汉模式
懒汉模式是再需要时才实例化,恶汉模式是声明的时候就实例化了
A a;//A为类名
public synchronized A lanhan()
{
if(a==null)
a=new A();//假设A的构造方法不带参数
return a;
}
B b=new B();
public synchronize B ehan()
{
return b;
}