分享

并发 张孝祥多线程与并发高级

 一本正经地胡闹 2019-12-04

并发,是线程之间切换的问题,跟cpu没有关系。但cpu也可以使用多线程,只是单cpu进行多线程并不会提高执行速度,甚至还会降低速度。
因为有线程上下文的切换开销,多cpu下的多线程才会翻倍提高。
那并发问题为什么会出现,更cpu没关系,而是跟线程切换有关,举例如下

if(i ==1) {
//执行点1
i++;
System.out.pint(i)
}//执行点2
假如线程A和线程B同时执行上面的代码,当线程A到达执行点2时,cpu进行时间片到期会切换到线程B,去执行线程B,此时线程B执行到If语句,发现i不等于1,则不会调用system。out这是正常的。
但是:如果现程A到达执行点1时时间片到期,于是i++还没有执行,此时线程B执行if语句发现条件为true并调用了system。out。当线程B执行完后,线程A继续执行点1后继续执行,于是system.out被执行了两次,这就是并发问题。

所以并发问题与cpu无关,与线程切换有关


张孝祥多线程案例:卖票

4条线程同时卖票。因为每条线程都有自己的100,卖的都是各自的100。所以需要创建1个资源对象,即只能创建包含100的1个对象。再创建多个线程,去处理这1个对象。

总结:多条线程,处理同1个对象(数据放在对象里面)。

public class SellTicketThread extends Thread{

    int ticketAmount =100;

    pubilc void run(){

        if(ticketAmount >0)System.out.println(--ticketAmount );

    }

}


public class TestThread{

    public static void main(String[] args){

        Thread t1 = new SellTicketThread ();

        Thread t2 = new SellTicketThread ();

        Thread t3 = new SellTicketThread ();

        Thread t4 = new SellTicketThread ();

    }

}

修改版:

public class SellTicketThread implements Runnable{

    int ticketAmount =100;

    pubilc void run(){

        if(ticketAmount >0)System.out.println(--ticketAmount );

    }

}

public class TestThread{

    public static void main(String[] args){

        SellTicketThread t = new SellTicketThread();

        

        Thread t1 = new Thread(t);

        Thread t2 = new Thread(t);

        Thread t3 = new Thread(t);

        Thread t4 = new Thread(t);



        //以下这样也是各自的100,因为创建了4个对象,每个对象里有自己的100。

        Thread t1 = new Thread(new SellTicketThread());

        Thread t2 = new Thread(new SellTicketThread());

        Thread t3 = new Thread(new SellTicketThread());

        Thread t4 = new Thread(new SellTicketThread());

        

    }

}

值得注意:匿名类里的this并非runnable,当前class的对象,并且带$,通过getClass发现是临时class,类似$Proxy.class,使用完文件便清除。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多