Java线程同步机制
解决方法:线程同步机制:
应用线程同步机制,解决懒汉式单例模式的线程安全问题:
线程死锁问题:
死锁的问题:处理线程同步时容易出现。
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
写代码时,要避免死锁!
什么时候会用多锁什么时候会用单锁
单锁是在操作一个共享数据时用到,如果多个线程操作一个共享数据,那么就是用单锁
多锁是在操作多个共享数据时用到,如果多个线程操作多个共享数据,那么就可以用多锁,因为单锁只能锁住一个共享数据,锁不住多个。前提是这多个共享数据之间没有在同一类中或包含关系。
Java线程通信:
线程通信。如下的三个关键字使用的话,都得在同步代码块或同步方法中。
wait(): 一旦一个线程执行到wait()就释放当前的锁。
notify()/notifyAll(): 唤醒wait的一个或所有锁。
经典例题:
生产者/消费者问题
生产者将产品交给店员,而消费者从店员处取走产品,店员一次只能持有固定数量的产品,如果生产者试图产生更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
具体代码实现:
挖坑种树问题:
问题描述:有三人在田间种树,一人负责挖坑,一人负责种树,一人负责填坑,三人的顺序不可颠倒,种树者必须等待挖坑人挖好一个坑在种树,填坑者要等待种树者将树种好之后在进行填坑,限种树数量为20棵。
问题解决代码:
编写代码中遇到的问题:
在编写好此代码后,运行时,发现在多次运行下,有时种树数量到达不到20棵,但是种树的线程就已经结束,导致填坑线程一致无法启动,经过调试,发现代码中少加一个判断条件;比如第一次,挖坑者挖好一个坑,这是种树者开始种树,当种树者完成后,填坑者抢到cpu开始填坑,这是种树者里面的判断条件是,判断还有没有种树的坑,但此时挖坑者只挖了一个坑,当然没有,未种树的坑,此时的种树者线程结束,因此当挖坑者再次抢到cpu挖坑时,种树者的线程早已结束,因此造成了此种现象。
解决方法:
由于有种20棵树的指标,因此当种树者在满足没有空余的坑要种树,结束线程之前,加上一个判断条件,看是否种了20棵树了,如果没有达到,就wait()一下等待挖坑线程将坑挖好之后在继续种树直到,达到指标在退出线程。