Java多线程-同步:synchronized 和线程通信:生产…
2019-08-16 12:21:09来源:博客园 阅读 ()
Java多线程-同步:synchronized 和线程通信:生产者消费者模式
大家伙周末愉快,小乐又来给大家献上技术大餐。上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式。
一、同步:synchronized
多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是加入同步后因为需要等待,所以效率相对低下。
如:一个苹果,自己一个人去咬怎么都不会出问题,但是多个人同时去咬,这个时候如果控制不好,就可能会咬到对方了。 再强调一下是一个苹果。
12306 中的火车票,为什么抢到票时,需要等待,锁定席位才付款?这就是确保一张票只能一个人去购买。
1、同步块
synchronized +块:同步块
synchronized (引用类型|对象|类.class) {
}
2、同步方法
修饰符 synchronized 返回类型|void 方法签名{
}
3、死锁
过多的同步容易死锁
/** * 死锁:容易造成死锁 * @author Administrator * */ public class TestDeadLock { /** * @param args */ public static void main(String[] args) { Object obj1 =new Object(); Object obj2 =new Object(); new A(obj1,obj2).start(); new B(obj1,obj2).start(); } } class A extends Thread{ Object obj1 ; Object obj2; public A() { } public A(Object obj1, Object obj2) { super(); this.obj1 = obj1; this.obj2 = obj2; } @Override public void run() { synchronized(obj1){ try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(obj2){ } } System.out.println("给我烟"); } } class B extends Thread{ Object obj1 ; Object obj2; public B() { } public B(Object obj1, Object obj2) { super(); this.obj1 = obj1; this.obj2 = obj2; } @Override public void run() { synchronized(obj2){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(obj1){ } } System.out.println("给我钱"); } }
二、线程通信:生产者消费者模式
线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其
他线程的信号。
Java 有一个内建的等待机制来允许线程在等待信号的时候变为非运行状态。
java.lang.Object 类定义了三个方法,wait()、notify()和 notifyAll()来实现这个等待机制。一个线程一旦调用了任意对象的 wait()方法,就会变为非运行状态,直到另一个线程调用了同一个对象的 notify()方法。为了调用 wait()或者 notify(),线程必须先获得那个对象的锁。也就是说,线程必须在同步块里调用 wait()或者 notify()。
以下为一个使用了 wait()和 notify()实现的线程间通信的共享对象:
/** * 街道 * @author Administrator * */ public class Street { //红绿灯 //false 红灯 -->人等 车走 -->换灯 通知人走 //true 绿灯 -->车等 人走 -->换灯 通知车走 private boolean flag=false; //东西向 -->人道 public synchronized void west(){ if(flag==false){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("东西向-->人走"); //换灯 this.flag =false; this.notify(); //唤醒等待者 } //南北向 车道 public synchronized void north(){ if(flag==true){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("南北向-->车走"); //换灯 this.flag =true; this.notify(); //唤醒等待者 } } class Person extends Thread { private Street s ; public Person(Street s) { this.s = s; } public void run() { for(int i=0;i<10;i++){ s.west(); //东西向 } } } class Car extends Thread { private Street s ; public Car(Street s) { this.s = s; } public void run() { for(int i=0;i<10;i++){ s.north(); } } }
Java多线程的同步和线程通信就介绍到这里,更多技术干货请关注乐字节。乐字节原创!
原文链接:https://www.cnblogs.com/lotbyte/p/11334852.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Class类对象的三种实例化方式
下一篇:自定义FutureTask实现
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash