线程安全

来源:互联网 发布:ubuntu 运行c 编辑:程序博客网 时间:2024/06/09 23:27

JAVA线程的特性是切换执行,很有可能该语句执行一半就切换时间片了,所以容易出现很多安全问题

为了避免这一问题,我们在多线程访问公共资源的时候应该考虑使用同步块或同步方法;

同步块


synchronized(object){

}

这个同板块内的内容一段时间内只能执行一次,第一个执行到的会锁上,接下来执行到的必须等解锁后才能执行。

例如int  a=10;

new Thread(){

Object obj;

synchronized(obj){//这里obj也可以替换成当前类或者参数

a++;

sleep(100000);//省略异常处理

}

}.start();


线程开启多个后,a并不会疯狂++;而是每隔大约100000ms加一次,因为第一个线程把同步块锁住之后休眠了,而其他线程必须等待解锁才能执行

同步方法

同步方法和同步块类似,把整个方法视作在一个同步块内



单例模式


同步方法和同步块常常用于单例模式,单例模式就是指整个程序唯一的一个

分为懒汉模式和饿汉模式

懒汉模式是再需要时才实例化,恶汉模式是声明的时候就实例化了


A a;//A为类名


publicsynchronized A lanhan()

{

if(a==null)

a=new A();//假设A的构造方法不带参数

return a;

}


B b=new B();


public synchronize B ehan()

{
   return b;
}


0 0