2016.6.20笔记(2)-多线程(3)
来源:互联网 发布:正元恒邦数据是假的吗 编辑:程序博客网 时间:2024/06/05 01:00
同步代码块
Java多线程支持引入了同步监视器来解决多线程安全,同步监视器的常用方法就是同步代码块。
Synchronized(obj){ //...同步代码块 }
括号中的obj就是同步监视器:上面的语句表示:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。这就意味着任何时刻只能有一条线程可以获得对同步监视器的锁定,当同步代码块执行结束后,该线程自然释放了对该同步监视器的锁定。
虽然java中对同步监视器使用的对象没有任何要求,但根据同步监视器的目的:阻止两条线程对同一个共享资源进行并发访问。所以一般将可能被并发访问的共享资源充当同步监视器。
public void run() { synchronized (accout) { // 账户余额大于取款金额时 if (accout.getBalance() >= drawAmount) { // 取款成功 System.out .println(Thread.currentThread().getName() + accout.getAccoutName() + "取款成功:吐出钞票:" + drawAmount); // 修改余额 accout.setBalance(accout.getBalance() - drawAmount); System.out.println("当前余额为:" + accout.getBalance()); } // 账户金额不够时 else { System.out.println("账户金额不够,您的余额只有" + accout.getBalance()); } } }
同步方法
synchronized可以修饰方法,代码块。不能修饰属性和构造方法.
除了同步代码块外还可以使用synchronized关键字来修饰方法,那么这个修饰过的方法称为同步方法。对于同步方法来说,无需显式指定同步监视器,同步方法的同步监视器是this,也就是该对象本身,也就是上面TestDraw中定义的Accout类型的acct。
public void run() { draw(); } public synchronized void draw() { if (accout.getBalance() >= drawAmount) { // 取款成功 System.out.println(Thread.currentThread().getName() + accout.getAccoutName() + "取款成功:吐出钞票:" + drawAmount); // 修改余额 accout.setBalance(accout.getBalance() - drawAmount); System.out.println("当前余额为:" + accout.getBalance()); } // 账户金额不够时 else { System.out.println("账户金额不够,您的余额只有" + accout.getBalance()); } }
0 0
- 2016.6.20笔记(2)-多线程(3)
- 2016.6.20笔记(1)-多线程(2)
- 多线程(3):JT第2章笔记
- ipmsg学习笔记3—多线程2
- 2014.07.20笔记、多线程
- 多线程笔记3
- 多线程笔记2
- 多线程笔记2
- 多线程学习笔记2
- 多线程学习笔记2
- 多线程学习笔记(2)
- java多线程学习笔记3
- c#多线程编程笔记3
- 多线程学习笔记3-NSOperationQueue
- Java 多线程学习笔记3
- java多线程学习笔记2
- c#多线程编程笔记2
- 多线程学习笔记(2)
- 自定义控件
- Android开发者的演示工具——asm.jar
- EntityFramework6写的数据访问框架之四使用
- vc++获取系统时间,几种方法!
- 花生壳80端口认证:快速搭建微信开发平台教程
- 2016.6.20笔记(2)-多线程(3)
- ASP.NET中IsPostBack详解
- [Android Pro] AIDL进程间传递自定义类型参数
- 图的基本存储的基本方式三
- 关于 不能从const char *转换为LPCWSTR
- Android开发网络状态实时监控
- 教你如何写框架------用中文构建脚本(更新版)
- Java - PAT - 1026. 程序运行时间(15)
- Android studio搭建开发环境