您的位置:首页 > 其它

几种特殊的多线程函数

2015-07-17 16:56 344 查看
静态

如果同步函数被静态修饰后,使用的锁是什么呢?

通过验证,发现不是this

因为静态方法中不可以定义this

静态进内存时,内存中没有本类对象,但是一定有给类对应的字节码文件对象。

类名:class 该对象的类型时Class

class Ticket implements Runnable
{
private int tick=100;
public void run()
{
synchronized(Ticket.class)
{
while(true)
{
if(tick>0)
{
System.out.println("tick..."+tick--);
}
}
}

}
}
class StaticDemo
{
public static void main(String[] args)
{
Ticket c=new Ticket();
Thread  t1=new Thread(c);
Thread  t2=new Thread(c);
t1.start();
t2.start();
}
}




单例设计模式

饿汉式

class Single
{
private static  Single s= null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}


这个不会出现安全问题;

懒汉式

class Single
{
private static  Single s= null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}

当有多线程时,在调用的方法中出现多条语句 ,就有可能出现安全问题

解决

class Single
{
private static  Single s= null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();
return s;
}
}
}
}


面试时注意

懒汉式与饿汉式有什么不同?

懒汉式特点在于延迟加载;

懒汉式在延迟加载时有没有问题?怎么解决?

有,在多线程访问时会出现安全问题;

可以加同步解决,用同步函数与同步代码块都可以,但是效率低效;所以我们用双重判断来解决效率问题;

加同步是用的锁是给类所属的字节码文件对象;

一般面试都会问

请写一个延迟加载的单例设计模式示例;

这时一定要写加同步的代码;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: