什么是死锁?
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这
些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代
码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放
资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所
需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有
的资源,将产生死锁。
死锁产生的原因是什么?
1. 系统资源的竞争
系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
2. 进程运行推进顺序不合适
进程在运行过程中,请求和释放资源的顺序不当,会导致死锁
什么是进程和线程?进程和线程的区别?
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程中执行运算的最小单位。线程也被称为轻量级进程。
区别?
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
执行过程:1.每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。
但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
2.线程是处理器调度的基本单位,但是进程不是。
1、线程安全是:
如果多个线程每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
2、线程不安全:
在多个线程同时访问同一个对象时会发生数据错误、不完整等情况时 那就是线程不安全.
创建线程的三种方式和线程池的优点
创建线程的三种方式:
1,继承Thread类创建线程。
2,实现Runnable接口创建线程。
3,使用Callable和Future创建线程。
线程池的优点:
1,避免了因为线程的创建和销毁锁带来的性能开销。
2,有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞。
3,能够对线程进行简单的管理,并提供定时、定期等功能操作。
synchronized与Lock的区别
1.synchronized是java内置关键字,在jvm层面。Lock是一个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁,Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。