




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
synchronized的作用一、同步方法public synchronized void methodAAA()/.锁定的是调用这个同步方法的对象测试:a、不使用这个关键字修饰方法,两个线程调用同一个对象的这个方法。目标类:1public class TestThread 2 public void execute() /synchronized,未修饰3 for(int i=0;i100;i+)4 System.out.println(i);5 6 7线程类:1public class ThreadA implements Runnable2 TestThread test=null;3 public ThreadA(TestThread pTest) /对象有外部引入,这样保证是同一个对象4 test=pTest;5 6 public void run() 7 test.execute();8 9调用:1TestThread test=new TestThread();2Runnable runabble=new ThreadA(test);3Thread a=new Thread(runabble,A); 4a.start();5Thread b=new Thread(runabble,B);6b.start();结果:输出的数字交错在一起。说明不是同步的,两个方法在不同的线程中是异步调用的。b、修改目标类,增加synchronized修饰1public class TestThread 2 public synchronized void execute() /synchronized修饰3 for(int i=0;i100;i+)4 System.out.println(i);5 6 7结果:输出的数字是有序的,首先输出A的数字,然后是B,说明是同步的,虽然是不同的线程,但两个方法是同步调用的。注意:上面虽然是两个不同的线程,但是是同一个实例对象。下面使用不同的实例对象进行测试。c、每个线程都有独立的TestThread对象。目标类:1public class TestThread 2 public synchronized void execute() /synchronized修饰3 for(int i=0;i100;i+)4 System.out.println(i);5 6 7线程类:1public class ThreadA implements Runnable2 public void run() 3 TestThread test=new TestThread();4 test.execute();5 67调用:1Runnable runabble=new ThreadA();2Thread a=new Thread(runabble,A); 3a.start();4Thread b=new Thread(runabble,B);5b.start();结果:输出的数字交错在一起。说明虽然增加了synchronized 关键字来修饰方法,但是不同的线程调用各自的对象实例,两个方法仍然是异步的。引申:对于这种多个实例,要想实现同步即输出的数字是有序并且按线程先后顺序输出,我们可以增加一个静态变量,对它进行加锁(后面将说明锁定的对象)。修改目标类:1public class TestThread 2 private static Object lock=new Object(); /必须是静态的。3 public void execute()4 synchronized(lock)5 for(int i=0;i100;i+)6 System.out.println(i);7 8 9 10二、同步代码块1public void method(SomeObject so)2 synchronized(so)3 /.4 5锁定一个对象,其实锁定的是该对象的引用(object reference)谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以按上面的代码写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它必须是一个对象)来充当锁(上面的解决方法就是增加了一个状态锁)。a、锁定一个对象,它不是静态的private byte lock = new byte0; / 特殊的instance变量目标类:1public class TestThread 2 private Object lock=new Object(); 3 public void execute()4 synchronized(lock) /增加了个锁,锁定了对象lock,在同一个类实例中,是线程安全的,但不同的实例还是不安全的。56因为不同的实例有不同对象锁lock7 for(int i=0;i100;i+)8 System.out.println(i);9 10 11 12 其实上面锁定一个方法,等同于下面的:1public void execute() 2 synchronized(this) /同步的是当然对象3 for(int i=0;i100;i+)4 System.out.println(i);5 6 7b、锁定一个对象或方法,它是静态的这样锁定,它锁定的是对象所属的类public synchronized static void execute() /.等同于1public class TestThread 2 public static void execute()3 synchronized(TestThread.class)4 /5 6 7测试:目标类:1public class TestThread 2 private static Object lock=new Object();3 public synchronized static void execute() /同步静态方法4 for(int i=0;i100;i+)5 System.out.println(i);6 7 8 public static void execute1()9 for(int i=0;i100;i+)10 System.out.println(i);11 12 13 public void test()14 execute(); /输出是有序的,说明是同步的15 /execute1(); /输出是无须的,说明是异步的16 17线程类:调用不同的方法,于是建立了两个线程类1public class ThreadA implements Runnable2 public void run() 3 TestThread.execute();/调用同步静态方法4 56public class ThreadB implements Runnable7 public void run() 8 TestThread test=new TestThread();9 test.test();/调用非同步非静态方法10 11调用:1Runnable runabbleA=new ThreadA();2Thread a=new Thread(runabbleA,A); 3a.start();4Runnable runabbleB=new ThreadB();5Thread b=new Thread(runabbleB,B); 6b.start();注意:1、用synchronized 来锁定一个对象的时候,如果这个对象在锁定代码段中被修改了,则这个锁也就消失了。看下面的实例:目标类:1public class TestThread 2 private static final class TestThreadHolder 3 private static TestThread theSingleton = new TestThread();4 public static TestThread getSingleton() 5 return theSingleton;6 7 private TestThreadHolder() 8 9 10 11 private Vector ve =null;12 private Object lock=new Object();13 private TestThread()14 ve=new Vector();15 initialize();16 17 public static TestThread getInstance()18 return TestThreadHolder.getSingleton();19 20 private void initialize()21 for(int i=0;i100;i+)22 ve.add(String.valueOf(i);23 24 25 public void reload()26 synchronized(lock)27 ve=null; 28 ve=new Vector();29 /lock=abc; 30 for(int i=0;i100;i+)31 ve.add(String.valueOf(i);32 33 34 System.out.println(reload end);35 36 37 public boolean checkValid(String str)38 synchronized(lock)39 System.out.println(ve.size();40 return ve.contains(str);41 42 43说明:在reload和checkValid方法中都增加了synchronized关键字,对lock对象进行加锁。在不同线程中对同一个对象实例分别调用reload和checkValid方法。在reload方法中,不修改lock对象即注释lock=abc; ,结果在控制台输出reload end后才输出100。说明是同步调用的。如果在reload方法中修改lock对象即去掉注释,结果首先输出了一个数字(当前ve的大小),然后输出reload end。说明是异步调用的。 2、单例模式中对多线程的考虑1public class TestThread 2 private static final class TestThreadHolder 3 private static TestThread theSingleton = new TestThread();4 public static TestThread getSingleton() 5 return theSingleton;6 7 private TestThreadHolder() 8 9 10 private Vector ve =null;11 private Object lock=new Object();12 private TestThread()13 ve=new Vector();14 initialize();15 16 public static TestThread getInstance()17 return TestThreadHolder.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 红酒相关知识培训课件
- 红酒定制知识培训课程表课件
- 红色基因代代传课件
- 企业年度法律顾问服务合同协议
- 诗经国风郑风子衿课件
- 红楼梦第五十八回课件
- 红楼梦第九回课件
- 健康咨询与管理协议
- 诗经中齐风鸡鸣课件
- 诗经中的植物课件
- 人美版《书法练习与指导》四年级上册整册教案
- 汉字形旁分类及其组字表
- NY-T 4251-2022 牧草全程机械化生产技术规范
- 代建项目安全生产管理办法20191226
- YS/T 690-2009天花吊顶用铝及铝合金板、带材
- GB/T 26463-2011羰基合成脂肪醇
- 静脉治疗护理质量评价标准
- 连铸坯质量控制与缺陷控制课件
- 社会调查研究方法-课件
- 雕塑基础教学课件
- 沥青混合料低温弯曲试验2002363
评论
0/150
提交评论