java面试–多线程,同步问题
相关概念:
1)程序:安装在磁盘上的一段指令集合,它是静态的概念。
2)进程:它是运行中的程序,它是动态的概念。每个进程有独立的资源空间
3)线程:轻量级的进程,是程序执行的最小单元,是程序中一个单一的顺序控制流程。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。
4)多线程:指在单个程序中可以同时运行多个线程执行不同的任务。
多线程优势
- 减少程序的响应时间;
- 与进程相比,线程的创建和切换开销更小;
- 在数据共享方面效率很高;
- 多CPU或多核计算及本身就具有执行多线程的能力,如果使用单线程,将无法充分利用计算机资源,造成资源的巨大浪费;
- 使用多线程能够简化程序结构,使程序便于理解和维护。
创建多线程的主要方法
- 继承Thread类,重写run方法
1)定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体;
2)创建Thread子类的实例,也就是创建了线程对象;
3)启动线程,即调用线程的start()方法。
代码:
class MyThread extends Thread{
public void run(){
System.out.println("Thread body");
}
}
public class Test{
public static void main(String[] args){
MyThread thread=new MyThread();
thread.start();//开启线程
}
}
- 实现Runnable接口,并实现该接口的run方法
1)定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体;
2)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象;
3)通过调用线程对象的start()方法来启动线程。
class MyThread implements Runnable{
public void run(){
System.out.println("Thread body");
}
}
public class Test{
public static void main(String[] args){
MyThread thread=new MyThread();
Thread t=new Thread(thread);
t.start();
}
}
上述第二种方法较为常用,可以避免单继承的局限性,因为一个类可以实现多个接口,但只能继承一个类;同时第二种方法更适合资源的共享。
线程同步
-
为什么需要同步:
防止多个线程访问一个数据对象时,对数据造成破坏;
可以保证多线程安全访问竞争资源。 -
如何实现同步
一个对象只有一个锁,所以一个线程获得该锁,就没有其线程可以获得锁,直到第一个线程释放锁。这意味着任何其他线程都不能进入synchronized方法或代码块,直到该锁被释放,释放锁代表着持锁线程推出了synchronized同步方法或代码块。