java线程 同步相关知识点梳理

 线程与并发 


1.线程和进程的区别?


线程:线程,是进程的一部分。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。线程之间共用一个进程的内存空存空间。
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位


2.开启线程的三种方式


* 继承Thread
* 实现Runnable接口
* 实现Callable方法

 3.如何正确的结束一个Thread?


interrupt(),这边需要再去看下《实战Java高并发程序设计》的40页

4.Thread 与 Runnable 的区别?


通过 ThreadEx和ThreadRun的运行
我们可以得出以下结论
继承Thread:多个线程分别完成自己的任务,比如卖票 3个线程各自卖10张票
实现Runnable接口:多个线程共同完成一个任务 ,比如卖票 3个线程共同卖10张票

5.run() 与 start() 方法的区别?


start
它的作用是启动一个新线程。
通过start()方法来启动的新线程,处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行相应线程的run()方法,这里方法run()称为线程体,
它包含了要执行的这个线程的内容,run方法运行结束,此线程随即终止。start()不能被重复调用。用start方法来启动线程,真正实现了多线程运行,
即无需等待某个线程的run方法体代码执行完毕就直接继续执行下面的代码。这里无需等待run方法执行完毕,即可继续执行下面的代码,即进行了线程切换。

run()就和普通的成员方法一样,可以被重复调用。
如果直接调用run方法,并不会启动新线程!程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,
还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到多线程的目的。

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

 6.sleep() 与 wait() 方法的区别?


sleep()
正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!)

wait()方法
当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,
可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度)

总结
sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;(为什么wait()方法只能在同步模块使用 IllegalMonitorStateException)

sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,
待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;

7.wait 与 notify 关键字的区别?


* 这边看下生产者消费者
* 为什么wait()和notify()需要搭配synchonized关键字使用

wait()方法
当一个线程在执行synchronized 的方法内部,调用了wait()后, 该线程会释放该对象的锁, 然后该线程会被添加到该对象的等待队列中(waiting queue), 只要该线程在等待队列中, 就会一直处于闲置状态, 不会被调度执行。 要注意wait()方法会强迫线程先进行释放锁操作,所以在调用wait()时, 该线程必须已经获得锁,否则会抛出异常。由于wait()在synchonized的方法内部被执行, 锁一定已经获得, 就不会抛出异常了。

notify()
当一个线程调用一个对象的notify()方法时, 调度器会从所有处于该对象等待队列(waiting queue)的线程中取出任意一个线程, 将其添加到入口队列( entry queue) 中. 然后在入口队列中的多个线程就会竞争对象的锁, 得到锁的线程就可以继续执行。 如果等待队列中(waiting queue)没有线程, notify()方法不会产生任何作用

8.synchronized 关键字的用法、作用及实现原理?


* 了解线程安全,先回答什么是线程安全 --->作用
用法(3种应用方式) :
* 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
* 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
* 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

针对修饰实例方法,要确保方法调用的是同一对象,才能确保线程安全
作用
线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。
即确保相应方法同步,需要某个方法执行完才能执行其他的

原理
 

9.volatile 关键字的用法、作用及实现原理?
10.transient 关键字的用法、作用及实现原理?
11.ReentrantLock、synchronized、volatile 之间的区别?
12.什么是线程池,如何使用?
13.多线程断点续传的实现原理?
14.什么是深拷贝和浅拷贝?
15.Java 中对象的生命周期?

你可能感兴趣的:(JAVA基础)