并发,是线程之间切换的问题,跟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());
} }
![](http://userimage8.360doc.com/20/0518/22/19913882_202005182228220489_large.jpg)
![](http://userimage8.360doc.com/20/0518/22/19913882_202005182227190302_large.jpg)
值得注意:匿名类里的this并非runnable,当前class的对象,并且带$,通过getClass发现是临时class,类似$Proxy.class,使用完文件便清除。
|