3.传统线程互斥技术
2015-07-10 11:07
281 查看
线程安全问题可以用银行转账来解释
/** * 传统的线程互斥技术 * @author LiTaiQing */ public class TraditionalThreadSynchronized { public static void main(String[] args){ new TraditionalThreadSynchronized().init(); } private void init(){ /** * 内部类访问局部变量,局部变量要加final * 若此代码放在main中会报错,因为静态代码块不能访问内部类 */ final Outputer outputer = new Outputer(); new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("zhangxiaoxiang"); } } }).start(); new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("lihuoming"); } } }).start(); } static class Outputer{ public void output(String name){ int len = name.length(); /* * 锁用任意一个对象都行,但只有同一个对象才具有互斥性 * 1.每个类的字节码文件只有一份,可以用来做互斥锁 * 2.用this也行 * 此处也可以在方法上架synchroized, * 但从多线程效率角度来看,合理细化同步块粒度能提高执行效率, * 所以此处在内部代码中加synchroized比较好 */ synchronized(Outputer.class){ for(int i = 0; i < len ; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } /** * output2方法不会同步,因为方法上加synchronized相当于加this锁 * 但又是静态方法,所以this会失效,会出现问题。 * @param name */ public static synchronized void output2(String name){ int len = name.length(); synchronized(Outputer.class){ for(int i = 0; i < len ; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } } }
相关文章推荐
- 实例分析用指针访问二维数组的几种方法
- 我的上半年“手相”-----“奔跑中的2015”
- android禁止界面横屏
- Guava 15新特性介绍
- 2.传统定时器技术回顾 - Timer类 TimerTask
- mongodb的基本操作
- 关于<img>标签无法显示名字中带有中文的图片的问题
- GRE写作必备句型
- 多维数组的指针类型转换和参数传递
- 要么忍,要么狠,要么滚
- 搜索引擎系列1:什么是正向索引?什么是倒排索引?
- 选项卡模式设计
- MyEclipse中Maven的配置
- 1.传统线程技术的回顾-JDK5多线程
- 【设计模式】动态代理Proxy_02
- 《算法4》中的堆排序
- 053第170题
- 关于 gitblite 配置的重点
- 安装Boost.Numpy
- Highcharts延x轴缩小