赞
踩
程序(program):为完成特定的任务,选用某一种语言编写的一组指令的集合,即指一段静态的代码,静态对象。
进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的、进程是动态的。
进程是操作系统调度和分配资源的最小单位。
注意:不同的进程之间是不共享内存的、进程之间的数据交换和通信的成本很高。
线程(thread):进程可以进一步细化为线程,是运行中进程的一条或多条执行路径。
线程调度策略
单核CPU与多核CPU
并行与并发
线程中的构造器
线程中的常用方法:
线程的优先级:
线程的生命周期
什么是线程安全问题:多个线程操作共享数据,就有可能出现安全问题
解决安全问题的几种方式
同步机制(synchronized):①同步代码块 ②同步方法
在实现Runnable接口的方式中,同步监视器可以考虑使用this。
在继承Thread类的方式中,同步监视器要慎用this(可能存在多个对象),建议使用:当前类.class。
非静态的同步方法,默认同步监视器是this
静态的同步方法,默认同步监视器是当前类
jdk5.0新增:Lock接口及其实现类
懒汉式的线程安全的写法
public class BankTest { static Bank b1 = null; static Bank b2 = null; public static void main(String[] args) { Thread t1 = new Thread(){ @Override public void run() { b1 = Bank.getInstance(); } }; Thread t2 = new Thread(){ @Override public void run() { b2 = Bank.getInstance(); } }; t1.start(); t2.start(); try { t1.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } try { t2.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(b1); System.out.println(b2); System.out.println(b1 == b2); } } class Bank{ private Bank(){} private static volatile Bank instance = null; // volatile避免指令重排 //实现线程安全的方式1 // public static synchronized Bank getInstance() { //同步监视器默认为Bank.class // if (instance == null){ // // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // throw new RuntimeException(e); // } // // instance = new Bank(); // } // return instance; // } // //实现线程安全的方式2 // public static Bank getInstance() { //同步监视器默认为Bank.class // synchronized (Bank.class) { // if (instance == null){ // // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // throw new RuntimeException(e); // } // // instance = new Bank(); // } // } // return instance; // } //实现线程安全的方式3:相较于1和2,优化,效率更高。为了避免出现指令重排,需要将instance声明为volatile public static Bank getInstance() { //同步监视器默认为Bank.class if (instance == null) { //instance为null,直接return,效率更高 synchronized (Bank.class) { if (instance == null) { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } instance = new Bank(); } } } return instance; } }
同步机制会带来的问题:死锁
如何看待死锁?
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了现成的死锁。(双方需要的资源都被占用,也不打算释放,就形成了死锁),编写程序时,要避免死锁。
诱发死锁的原因 及 如何避免死锁?
线程间通信的理解
涉及到三个方法的使用:
注意点:
wait() 和 sleep()的区别?(高频面试题)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。