java synchronized用法
2015-07-20 09:12
423 查看
一、使用的时候要注意
1.无论synchronized是加在方法还是对象上,它取得的锁都是对象的,而不是将一段代码或者方法锁定。
2.每个对象只有一个lock与之对应。
3.实现同步要比较大的系统开销。
二、synchronized关键字作用域有两种
1.在一个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法,如果一个对象有多个synchronized
方法,其它的线程不能同时访问这个对象中的任何一个synchronized方法。但是相同类的不同实例之间synchronized方法是不相干扰的。
2.在类的范围中,synchronized static aStaticMethod(){}防止多个线程同时访问这个类中的synchronized static 方法,它可以对类的所有实例起
作用。
例子:
电影院有20张票,三个seller同时在卖。
运行结果
sell2:20
sell2:19
sell2:18
sell3:17
sell1:16
sell1:15
sell3:14
sell3:13
sell3:12
sell3:11
sell2:10
sell3:9
sell1:8
sell3:7
sell3:6
sell3:5
sell3:4
sell3:3
sell3:2
sell3:1
1.无论synchronized是加在方法还是对象上,它取得的锁都是对象的,而不是将一段代码或者方法锁定。
2.每个对象只有一个lock与之对应。
3.实现同步要比较大的系统开销。
二、synchronized关键字作用域有两种
1.在一个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法,如果一个对象有多个synchronized
方法,其它的线程不能同时访问这个对象中的任何一个synchronized方法。但是相同类的不同实例之间synchronized方法是不相干扰的。
2.在类的范围中,synchronized static aStaticMethod(){}防止多个线程同时访问这个类中的synchronized static 方法,它可以对类的所有实例起
作用。
例子:
电影院有20张票,三个seller同时在卖。
package javastudy; public class Test7 { public static void main(String [] args){ SellThread sellThread = new SellThread(); Thread sell1 = new Thread(sellThread,"sell1"); Thread sell2 = new Thread(sellThread, "sell2"); Thread sell3 = new Thread(sellThread, "sell3"); sell1.start() ; sell2.start(); sell3.start() ; } } class SellThread implements Runnable{ private int i=20; public void run() { while(true){ synchronized (this) { if (i>0){ try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } System.out.println(Thread.currentThread().getName()+":"+i--); } } } } }
运行结果
sell2:20
sell2:19
sell2:18
sell3:17
sell1:16
sell1:15
sell3:14
sell3:13
sell3:12
sell3:11
sell2:10
sell3:9
sell1:8
sell3:7
sell3:6
sell3:5
sell3:4
sell3:3
sell3:2
sell3:1
相关文章推荐
- eclipse解决editor does not contain a main type的方法
- eclipse常用的快捷键
- java中的构造方法的使用及作用分析
- 《深入浅出struts2》--第一章,Model2应用程序
- Eclipse中安装Genymotion插件解决方案
- java导出excel表格,Struts2配置
- springmvc批量文件打包成zip下载功能
- Java多线程之生产者消费者模式
- java并发编程第五章(1) 创建Fork/Join线程池
- 转:java提取图片中的像素
- Java本地文件操作
- JAVA基础-反射
- ——JAVASE-IO流(下)
- JAVA String
- ——JAVASE-IO流(上)
- openjdk源码下载
- Java并发编程实战(使用synchronized实现同步方法)
- eclipse连接hbase异常KeeperErrorCode = ConnectionLoss for /hbase/meta-region-server
- java unicode转utf-8
- springmvc,spring,hibernate整合-使用packagesToScan扫描实体