黑马程序员系列第一篇多线程(1)

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

asp.net+Android+IOS开发 、Net培训、期待与您交流!

(前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频 百度网盘链接地址:http://pan.baidu.com/s/1sjQRHDz)

目录:一、线程的两种创建方式 二、线程的五种状态、线程操作中常用的方法 三、多线程安全 四、使用同步的弊端 五、单例设计模式中的多线程(面试重点)

一、线程的两种创建方式

1、实现Runnable接口(主流)

代码示例:

1publicclassThreadTest{23publicstaticvoidmain(String[] args)throwsInterruptedException{4ThreadImple ti=newThreadImple();5Thread thread=newThread(ti);67thread.start();8}9}10classThreadImpleimplementsRunnable {1112@Override13publicvoidrun() {14for(inti=0;i<60;i++)15System.out.PRintln("thread implements runnable..."+i);16}17}

2、继承Thread类

1publicclassThreadTest{23publicstaticvoidmain(String[] args)throwsInterruptedException{4ThreadExtends ti=newThreadExtends();56ti.start();7}8}9classThreadExtendsextendsThread {1011publicvoidrun() {12for(inti=0;i<60;i++)13System.out.println("extend thread class..."+i);14}15}

3、两种创建方式的区别

实现方式的运行代码存放在接口子类的run方法中;实现方式避免了单继承的局限性,建议使用

继承方式的运行代码存放在Thread子类的run方法中

二、线程的五种状态 线程操作中常用的方法

三、多线程安全

问题:一个线程操作多条语句来共享数据时,一个线程对多条语句只执行了一部分,另一个线程便参与进来执行了,导致共享数据出错。

如何寻找问题: 1、明确哪些代码示多线程运行代码 2、明确共享数据 3、明确多线程运行代码中哪些语句是操作共享数据的。

解决办法:同步代码块:

Synchronized( 锁 ){

需要被同步的代码;

}

同步函数:在函数前加synchronized修饰符。

使用同步要满足三个前提:1、必须有两个或两个以上线程 2、必须是多个线程使用同一个锁

弊端:每次执行时都要判断锁,浪费资源。

普通同步函数的锁是this ,静态函数的锁是其所在文件字节码对象(.class)

简单模拟售票代码:

1/*2程序一共创建三个线程模拟三个售票窗口 ticket=100将票号设为1-100 我们希望票号不重复3遗憾的是结果会出现票号为负数、相同票号的问题 也就是我们要讲到的线程不安全问题4*/5publicclassSaleTicketUnsafe {67publicstaticvoidmain(String[] args) {89Ticket ticket=newTicket();1011newThread(ticket).start();12newThread(ticket).start();13newThread(ticket).start();1415}1617}18classTicketimplementsRunnable{1920privateintticket=100;21publicvoidrun(){22while(true){23if(ticket>0){24try{25Thread.sleep(10);//线程出错概率不是很大,所以要让线程休眠sleep()来将问题暴露出来26}catch(InterruptedException e) {27//TODO Auto-generated catch block28e.printStackTrace();29}30System.out.println(Thread.currentThread().getName()+"售票口出售---车票号:"+ticket--);31}32}3334}35}

使用同步代码块的方式改进后的程序

1/*同步代码块的方式解决了问题*/2publicclassSaleTicketSafe {34publicstaticvoidmain(String[] args) {5Tickets ticket=newTickets();67newThread(ticket).start();8newThread(ticket).start();9newThread(ticket).start();10}1112}13classTicketsimplementsRunnable{1415privateintticket=100;16Object obj=newObject();17@Override18publicvoidrun() {19while(true){20synchronized(obj){//同步代码块21if(ticket>0){22try{23Thread.sleep(10);24}catch(InterruptedException e) {25//TODO Auto-generated catch block26e.printStackTrace();27}28System.out.println(Thread.currentThread().getName()+"售票口出售---车票号:"+ticket--);29}30}31}32}3334}

四、使用同步会出现死锁情况(面试时会要求写一个死锁程序)

问题:多线程各自持有不同的锁没释放,而又彼此需要对方的锁。

原因:同步中嵌套同步,而它们的锁却不同

一个简单的死锁程序:

1publicclassDieLock {23publicstaticvoidmain(String[] args){4//开启两个线程测试5Thread t1=newThread(newTest(true));6t1.start();7Thread t2=newThread(newTest(false));8t2.start();9}10}11classTestimplementsRunnable{12booleanflag;13publicTest(booleanf){14this.flag=f;15}16@Override17publicvoidrun() {18if(flag){19while(true){20synchronized(Lock.lockb){21System.out.println("if locka");22synchronized(Lock.locka){23System.out.println("if lockb");24}25}26}27}else{28while(true){29synchronized(Lock.locka){30System.out.println("else locka");31synchronized(Lock.lockb){32System.out.println("else lockb");33}34}35}36}37}38//单独定义两个不同的锁39staticclassLock{40staticObject locka=newObject();41staticObject lockb=newObject();42}43}

五、单例设计模式中的多线程(面试重点)

饿汉式、懒汉式(是线程不安全的,需要同步)

将懒汉式同步有两种方式:

1、下面代码中在getInstance方法前用synchronized修饰,通过同步函数来解决,每次都要同步比较消耗资源

2、就是注释中用同步块的方式,用双重判断(s==null)只需同步一次,避免多消耗资源,推荐使用

1publicclassSingle{2publicstaticvoidmain(String[] args){34Singlel s=Singlel.getInstance();56}7}8//懒汉式9classSinglelextendsSingle{1011privateSinglel(){}12privatestaticSinglel s=null;1314publicstaticsynchronizedSinglel getInstance(){15if(s==null)16s=newSinglel();17//if(s==null){18//synchronized(Singlel.class){ 方法二、双重判断 ,提高效率19//if(s==null)20//s=new Singlel();21//}22//}23returns;24}25}26//饿汉式27classSingleeextendsSingle{28privateSinglee(){}29privatestaticSinglee s=newSinglee();3031publicstaticSinglee getInstance(){32returns;33}3435}

初学者难免错误,欢迎评判指教,持续更正ing...........

ASP.Net+Android+IOS开发 、Net培训、期待与您交流!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航