Day13总结
1、单列设计模式:
1、恶汉式:
代码表达:
Class Single
{
Privtae static final Single s=new Single();
Private Single(){}
Public static Single getInstance()
{
Return s;
}
}
2、懒汉式:延迟加载,存在着多线程并发访问的平安问题,需要利用同步来解决平安问题,可是同步会降低效率,所以利用双重if()判断形式解决效率低的问题。
实现代码:
Class Single
{
Private Single〔〕{}
Private static Single s=null;
Public static Single getInstance()
{
If(s==null)
{
Synchroinzed(Single.class)
{
If(s==null)
S=new Single();
}
Return s;
}
}
}
2、死锁:即同步的短处,不是线程和进程没有了,而是不动了。
培训机构出来的程序员真的强吗表现形式:同步嵌套的时候,利用的锁不一样,容易引发死锁。
实现代码:
3、线程间通信:
其实就是多个线程在操作同一个资源,可是操作的动作不同,动作不同,意味着线程的任务是不一样的。就需要对任务对象进展单独的封装和描述。
4、等待唤醒机制:最重要的机制重点掌握
Wait〔〕:等待:让当前线程出于冻结状态,当前线程就被存储到线程池当中。
Notify();唤醒线程池中的任意一个线程,让该线程恢复到运行状态,会具有CPU的执行资格。
notifyAll():唤醒线程池中的所有等待的线程,让它们具有CPU的执行资格。
所谓的监视器:就是多线程中的锁。上面几个功能必需在同步当中,要标示清楚它所在的锁。
也就说:wait到底让哪个锁上的线程等待了,notify:究竟是唤醒了哪个锁上被等待的线程。
NotifyAll:用上面的一样。
为何是Object中的方式?
因为这些方式都是必需要标识出所属的锁,而锁是任意的对象。能被任意对象挪用的方式必然概念在Object类中。一般在利用等待和唤醒时通常都得有标记。
class Resource
{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}catch(Exception e){}
this.name = name;
this.sex = sex;
flag = true;
ify();
}
public synchronized void out()
{
if(!flag)
try{this.wait();}catch(Exception e){}
System.out.println(name+"----"+sex);
flag = false;
ify();
}
}
class Input implements Runnable
{
Resource r;
Input(Resource r)
{
this.r = r;
}
public void run()
{
int x = 0;
while (true)
{
if(x==0)
r.set("mike","nan");
else
r.set("丽丽","女女女女女");
x = (x+1)%2;
}
}
}
class Output implements Runnable
{
Resource r;
Output(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.out();
}
}
}
class ResourceDemo3
{
public static void main(String[] args)
{
Resource r = new Resource();
Input in = new Input(r);
Output out = new Output(r);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论