JAVA多线程

标题JAVA

多线程
进程和线程
一个正在运行的程序通常称为一个进程,每个进程都有自己独立运行的一块内存空间,每个进程的内部数据和状态都是完全独立的。

在进程内部有时会需要同时执行多个子任务。例如,我们在使用Word时,可以一边打字,一边拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
一个进程可以包含一个或多个线程,但至少会有一个线程。

线程是操作系统调度的最小任务单位

实现多任务的几种方式

  1. 多进程模式(每个进程只有一个线程)
  2. 多线程模式(一个进程有多个线程)
  3. 多进程+多线程模式

两者对比:

  1. 创建进程比创建线程开销大
  2. 进程间通信比线程间通信要慢,因为线程间通信就是读写同一个变量,速度很快。
  3. 多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃都会导致整个进程崩溃。

线程的生命周期

新建–就绪–运行–阻塞–死亡

线程的创建和启动

1.继承Thread类并重写run方法

2.实现Runnable接口,实现run方法

3实现callable接口,实现run方法

4.创建线程池

线程的优先级

当两个或两个以上的线程同时处于就绪状态时,优先级高的线程会优先执行

线程同步
什么是线程同步,线程同步是指,当两个或两个以上的线程同时访问同一个资源时,为了确保数据的安全,只允许同一时间点,同一个共享资源只被一个线程进行访问。线程同步也称为线程安全。

线程同步的结果

1.数据安全

2.效率低下

怎么实现线程同步,使用synchronized,有两种实现方法,同步方法和同步块

死锁
死锁是指在多线程情况下,多个线程同步竞争相互依赖的资源,从而造成多线程无法继续执行的情况。死锁一旦发生就很难调试

wait-notity

  1. Java使用wait()、notify()和notifyAll()方法,完成线程间的通信。这些方法是作为 Object 类中的 final 方法实现的。这三个方法仅在 synchronized 方法中才能被调用。
  2. wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用 notify( ) 方法。
  3. notify( ) 方法通知同一对象上第一个调用 wait( )线程。
  4. notifyAll() 方法通知调用 wait() 的所有线程,具有最高优先级的线程将先运行。

wait和sleep的区别

  1. sleep方法在线程类Thread中定义,wait方法在Object中定义。
  2. wait方法只能放在同步方法或同步块中,表示当前线程对资源进行等待。sleep方法可以放在任何位置,表示当前线程休眠。
  3. wait方法要释放对象锁,sleep方法不会释放对象锁。
  4. wait方法使用后,线程需要notify唤醒后才能继续执行。而sleep在休眠结束后,线程自动继续执行。

Lock接口
特点:

  1. Lock是一个接口,而synchronized是Java内置的语言实现;
  2. synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unlock()去释放锁,则很可能造成死锁现象,因此使用lock时需要在finally块中释放锁;
  3. Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
  4. 通过Lock可以知道有没有成功获取锁,而synchronized无法办到;
  5. lock可以提高多个线程进行读操作的效率

lock方法可以获取锁,但无返回值
trylock有返回值,表示获取锁,如果成功获取,返回值为true
unlock()方法可以释放锁

Volatile
volatile变量是Java语言提供的一种稍弱的同步机制,用来确保将变量的更新操作通知到其他线程。

在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。

当一个变量定义为 volatile 之后,将具备两种特性:

  1. 保证此变量对所有的线程的可见性,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存
  2. 禁止指令重排序优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值