黑马程序员——Java基础---线程的另一个总结(3)--互斥,线程锁
2015-07-01 22:37
651 查看
synchronized要达到同步效果关键是“锁对象必须是同一个”,同一个对象可以用this,同一个类中可以使用 类名.class
示例代码
创建所有两种方式,一个是用synchronized括起来要执行的代码,另一个是直接在方法上加synchronized。
方法3中使用了static方法,比用使用同一个字节码,得用字节码文件 类名.class
示例代码
创建所有两种方式,一个是用synchronized括起来要执行的代码,另一个是直接在方法上加synchronized。
public class TraditionalThreadSynchronized { /** * @param args */ public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } private void init(){ final Outputer outputer = new Outputer(); new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } outputer.output("zhangxiaoxiang"); } } }).start(); new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } outputer.output2("lihuoming"); } } }).start(); } static class Outputer{ //创建锁的方式1 public void output(String name){ int len = name.length(); synchronized (this) { for(int i=0;i<len;i++){ System.out.print(name.charAt(i)); } System.out.println(); } } //创建锁的方式2 public synchronized void output2(String name){ int len = name.length(); for(int i=0;i<len;i++){ System.out.print(name.charAt(i)); } System.out.println(); } } }
方法3中使用了static方法,比用使用同一个字节码,得用字节码文件 类名.class
public class TraditionalThreadSynchronized { /** * @param args */ public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } private void init(){ final Outputer outputer = new Outputer(); new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } outputer.output("zhangxiaoxiang"); } } }).start(); new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } outputer.output3("lihuoming"); } } }).start(); } static class Outputer{ public void output(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(); } } public synchronized void output2(String name){ int len = name.length(); for(int i=0;i<len;i++){ System.out.print(name.charAt(i)); } System.out.println(); } public static synchronized void output3(String name){ int len = name.length(); for(int i=0;i<len;i++){ System.out.print(name.charAt(i)); } System.out.println(); } } }
相关文章推荐
- 从其他程序员身上学习,取长补短
- 摘录-IT企业必读的200个.NET面试题-04 字符串、集合和流的使用
- 2015年换工作感想
- 黑马程序员---多线程
- 黑马程序员-java基础-总结的几点问题
- 面试题3 ----二维数组中的查找
- 蛋糕求职记--小时候淘气,长大了淘宝
- 程序员如何快速准备面试中的算法
- 黑马程序员——Java基础---线程的另一个总结(2)--定时器
- 程序员必须知道的8大排序和3大查找
- 黑马程序员——java基础---关键字、常量、变量、运算符
- 面试题
- 黑马程序员-----IO流
- 黑马程序员——Java基础---线程的另一个总结(1)--基本创建方法
- 面试中的优缺点
- 程序员的学习方法【思考】
- 程序员的学习方法【思考】
- 黑马程序员——Java基础---反射
- Java面试 多线程 生产者消费者
- 黑马程序员--java基础学习笔记2