------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
多线程:
创建一个线程的第一种方式:继承Thread类。
步骤:
1.定义类继承Thread.
2.重写Thread类中的run 方法。
3.调用线程的start 方法。
该方法有两个作用:启动线程,调用run 方法。
Thread类用于描述线程,
它定义了一个功能,用于存储线程要运行的代码。该存储功能就是run 方法。
创建一个线程的第二种方式:继承Runnable接口。
两种方法的区别:
继承Thread:线程代码存放在Thread子类的run方法中。
实现Runnable:线程代码存放在接口子类的run方法中。
多线程的安全问题:
当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完另一个线程参与进来执行。
解决方法:
对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行。
Java对于多线程的安全问题提供了专业的解决方案:
就是同步代码块
Synchronized(对象){
需要被同步的代码
}
火车上的卫生间——经典(同步锁)
同步的前提:
1、必须要有两个或者两个以上的线程。
2、必须是多个线程使用同一个锁。
必须保证同步中只能有一个线程在运行。
优点:解决了线程的安全问题
弊端:多个线程都需要判断锁,较消耗资源,
同步函数所使用的锁是this
同步函数被静态修饰后使用的锁是该方法所在类的字节码文件对象。类名.class
单例设计模式
懒汉式与饿汉式单例设计模式的不同:
懒汉式:
它的特点是实例的延迟加载,但是存在问题如果多线程访问时会出现安全问题,可以加同步来解决,加同步的方式:可以用同步代码块儿但稍微有些低效,用双重判断的方式可以解决效率问题,加同步的时候使用的锁是:该类所属的字节码文件对象。
饿汉式:
public class Single {
//饿汉式
private static final Single single=new Single();
private Single(){}
public static synchronized Single getInstance(){
return single;
}
//懒汉式
private static Single single=null;
private Single(){}
public static Single getInstance(){
if(single==null){
synchronized(Single.class){
if(single==null){
single=new Single();
}
}
}
return single;
}
}
死锁:同步中嵌套同步但锁不同。
当用线程写生产者消费者(多个生产者,多个消费者)时必须用while循环和notifalyAll();
JDK1.5中提供了(显示的锁机制及显示的锁对象上的等待唤醒操作机制)多线程升级解决方案。将同步synchronized替换成现实Lock操作。将Object 中的wait,notify ,notifyAll替换成了Condition对象,该对象可以Lock锁进行获取。它实现了本方只唤醒对方操作。(生产者消费者有什么替换方案?)
Stop方法已经过时,停止线程只有一种让run方法结束,开启多线程运行的代码通常是循环结构,只要控制住循环,就可以让run方法结束,即线程结束。
特殊情况:
当线程处于冻结状态,就不会读取到标记,那么线程就不会结束,当没有指定的方式让冻结的线程恢复到运行状态时,需要对冻结进行清除,强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();
Join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行,join可以用来临时加入线程执行!