线程自动退出_Java开发课程(十八)——多线程 2、多线程编程

多线程编程

0d125fde44e38d97ce33142d9af8c018.png
  • 线程同步

1、为什么需要同步

一线程同步是为了防止多个线程访问一个数据对象时,对数据造成破坏线程的同步 是保证多线程安全访问竞争资源的一种手段。

2、同步和锁定

一Java中每个对象都有一个内置锁。

一当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类 的当前实例(this实例)有关的锁;当程序运行到synchronized同步代码块时, 自动获得锁定对象的锁。

一获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。当 程序运行到synchronized同步方法或代码块时该对象锁才起作用。

一一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得 锁,直到第一个线程释放锁。这也意味着任何其他线程都不能进入 synchronized方法或代码块,直到该锁被释放。释放锁是指持锁线程退出了 synchronized同步方法或代码块。

3、对于同步,一般而言在java代码中需要完成两个操作:

一把竞争访问的资源标识为private。

一同步那些访问资源的代码,使用synchronized关键字同步方法或代码块。当 synchronized方法执行完或发生异常时,会自动释放锁。

4、同步产生死锁的原因

一当一个线程已经获取了对象1的锁,同时又想获取对象2的锁。而此时另一个线程当前已经持有了对象2的锁,而又想获取对象1的锁。这种互相等待对方释放锁的过程,会导致"死锁"。

  • 线程通信

1、在现实应用中,很多时候需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题:

一这类问题描述了这样一种情况,假设仓库中只能存放一件产品,生产者将生产出 来的产品放入仓库,消费者将仓库中的产品取走消费。如果仓库中没有产品,则 生产者可以将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者 取走为止。如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费 并等待,直到仓库中再次放入产品为止。

一显然,这是一个同步问题,生产者和消费者共享同一资源,并且,生产者和消费 者之间彼此依赖,互为条件向前推进。

2、该如何编写程序来解决这个问题呢?

3、传统的思路是利用循环检测的方式来实现,通过重复检查某一个特定条件是否成立来决定线程的推进顺序

一比如,一旦生产者生产结束,它就继续利用循环检测来判断仓库中的产品是否被 消费者消费,而消费者也是在消费结束后就会立即使用循环检测的方式来判断仓 库中是否又放进产品。

一显然,这些操作是很耗费CPU资源的,不值得提倡。

4、有没有更好的方法来解决这类问题呢?

5、Java提供了3个重要方法巧妙解决线程间的通信问题。这3个方法分别是:wait()、notify()和notifyAll()。

6、调用wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒。

7、调用notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使以线程退出等待队列,进入可运行态。

8、调用notify0方法可以使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,此时,优先级最高的那个线程最先执行。

  • 课程内容

1、线程同步

2、线程通信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值