Java线程同步

来源:互联网 发布:专升本网络教育 编辑:程序博客网 时间:2024/06/05 22:49

1.线程同步

1)通讯模型:监视线程通讯模型:同时多个独立线程在运动,其运行时的状态由第三方监控线程全程监控,这就是监视线程通讯模型

2)线程同步:为什么要进行线程同步:多线程存在的问题是,假如同时有多个线程操作一个对象的数据,有可能出现线程对象对自己操作

的数据不同步的情况,也就是说可能会导致运算结果出现错误。

3)线程同步问题的解决方案:使用synchronized关键字来解决,解决的方式是通过锁定对象或者方法来完成线程的同步操作

                                                    对方法进行同步锁:

public synchronized void say(){}

如上格式,此方法就被同步锁了,当一个线程操作此方法时,其他的线程则不能操作此方法,只有等当前线程操作完此方法,其他线程
才能对此方法进行操作
 对对象进行同步锁:
public void run() {synchronized(list){while(true){if(list.size()==0){Phone phone = new Phone();list.add(phone);System.out.println("生产者生产了一部手机,型号为:phone"+type);list.notify();type++;}else{try {list.wait();} catch (InterruptedException e) {e.printStackTrace();}}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}
当一个线程对当前对象进行操作时,其他线程则不能同时操作
2.生产者消费者模型实现
1)模型的概念:生产线程和消费线程共同操作一个集合,生产者放入对象,消费者取出对象,当集合中没有对象时,生产线程马上回放入一个
对象,而当集合中又对象时,消费者马上会取出一个对象
2) 在java中,每个对象都有从Object父类继承而来的两个关于线程间通讯的方法wait()和notify(),如其方法名所示,一个是等待,一个是通知,当在一个对象上调用wait()方法时,当前线程就会进行wait状态,直到收到另一个对象的notify()发出通知,才会执行下一步计算,在多线程通讯中,经常会用对象的这两个方法,一个典型的案例就是“生产/消费者模型”。
3)注意:wait和notify必须在同步锁之内使用
                同步锁锁定对象和wait、notify对象必须同一个
                 当对象wait挂起状态时候是会释放同步锁的

3.线程的生命周期

1)当线程调用start()方法时,线程处于就绪状态,并尝试着来获取CPU的权限,当获得了CPU的权限后就开始运行。

2)当运行时调用sleep(),join(),方法时,线程就会睡眠,时间是方法里面的参数决定,当睡眠时间到了时,便重新回到就绪状态

3)当在运行时调用wait()方法,线程会进入等待状态,当另一个与当前线程进行的通信的线程调用了notify()方法,通知了还在

等待的线程后,这个等待的线程就会开始运行

4)当使用了同步锁,其他线程将会被阻塞,只有当前线程执行完后,其他线程才会运行

5)当线程的run方法执行完毕后,线程死亡



0 0