多线程理解:http://www.runoob.com/java/java-multithreading.html

50道常考题:https://blog.csdn.net/u011163372/article/details/73995897/

 

java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。

 

什么是进程间并发执行?

  • 两个或多个活动在同一时间间隔内发生

并发进程之间存在着哪两种关系?

  • 同步,互斥

请你谈谈Java如何实现多线程,线程安全在Java中是如何实现的,线程的工作区是哪里

  • Java多线程实现方式主要有四种:继承Thread类(重写run方法)、实现Runnable接口(重写run方法)、实现Callable接口(重写call方法);
  • 线程不安全的原因:  在操作系统中,线程是不拥有资源的,进程是拥有资源的。而线程是由进程创建的,一个进程可以创建多个线程,这些线程共享着进程中的资源。所以,当线程一起并发运行时,同时对一个数据进行修改,就可能会造成数据的不一致性
  • 线程安全的解决机制: 1. 加锁。 (1) 锁能使其保护的代码以串行的形式来访问,当给一个复合操作加锁后,能使其成为原子操作。一种错误的思想是只要对写数据的方法加锁,其实这是错的,对数据进行操作的所有方法都需加锁,不管是读还是写。 (2) 加锁时需要考虑性能问题,不能总是一味地给整个方法加锁synchronized就了事了,应该将方法中不影响共享状态且执行时间比较长的代码分离出去。 (3) 加锁的含义不仅仅局限于互斥,还包括可见性。为了确保所有线程都能看见最新值,读操作和写操作必须使用同样的锁对象。
  • 2. 不共享状态 (1) 无状态对象: 无状态对象一定是线程安全的,因为不会影响到其他线程。 (2) 线程关闭: 仅在单线程环境下使用。
  • 3. 不可变对象 可以使用final修饰的对象保证线程安全,由于final修饰的引用型变量(除String外)不可变是指引用不可变,但其指向的对象是可变的,所以此类必须安全发布,也即不能对外提供可以修改final对象的接口。
  • 所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中