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小时内删除。