Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2856928
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Java

2012-03-17 16:37:17

1、多线程打印屏幕,出现不可预想的结果

点击(此处)折叠或打开

  1. package cn.itcast.thread;

  2. public class ThreadSynchronized {

  3.     /**
  4.      * @param args
  5.      */
  6.     public static void main(String[] args) {
  7.         //final InnerOutput inneroutput=new InnerOutput();

  8.         //静态方法中不能new内部类的实例对象,静态方法可以不用创建实例就可以访问的

  9.         //但是内部类要依赖于外部类的实例,矛盾

  10.         new ThreadSynchronized().init();
  11.     }
  12.     
  13.     public void init(){
  14.         final InnerOutput inneroutput=new InnerOutput();
  15.         new Thread(new Runnable(){
  16.             @Override
  17.             public void run(){
  18.                 while(true){
  19.                     try {
  20.                         Thread.sleep(1000);
  21.                     } catch (InterruptedException e) {
  22.                         // TODO Auto-generated catch block

  23.                         e.printStackTrace();
  24.                     }
  25.                     inneroutput.output("zhangxiaoxiang");
  26.                 }
  27.             }
  28.         }).start();
  29.         
  30.         new Thread(new Runnable(){
  31.             @Override
  32.             public void run(){
  33.                 while(true){
  34.                     try {
  35.                         Thread.sleep(1000);
  36.                     } catch (InterruptedException e) {
  37.                         // TODO Auto-generated catch block

  38.                         e.printStackTrace();
  39.                     }
  40.                     inneroutput.output("lihuoming");
  41.                 }
  42.             }
  43.         }).start();
  44.     }
  45.     class InnerOutput{
  46.         public void output(String name){
  47.             int len=name.length();
  48.             for(int i=0;i<len;i++){
  49.                 System.out.print(name.charAt(i));
  50.             }
  51.             System.out.println();
  52.         }
  53.     }
  54. }

  55. 输出:
  56. zlihuohangxiaoxiangming

  57. lihuoming
  58. zhangxiaoxiang
  59. lihuoming

关键是找一把共同的锁

1Synchronized修饰方法与代码块,方法用的就是this,而代码块用的不一定是this,如果是this,则这个方法与那段代码块也能同步了。

2Synchronized修饰代码块时,Synchronized(object)object只要是对象就行,如果不用this(因为不同一把锁),这样创建多个实例时,同步根本不能起作用



点击(此处)折叠或打开

  1. class InnerOutput{
  2.         /**
  3.          * 用synchronized修饰方法后,这段打印代码就能同步,
  4.          * 一个线程执行完,另外一个线程才能执行
  5.          * @param name
  6.          */
  7.         public synchronized void output(String name){
  8.             int len=name.length();
  9.             for(int i=0;i<len;i++){
  10.                 System.out.print(name.charAt(i));
  11.             }
  12.             System.out.println();
  13.         }
  14.     }

  15. 输出:
  16. zhangxiaoxiang
  17. lihuoming
  18. zhangxiaoxiang
  19. lihuoming
  20. zhangxiaoxiang
  21. lihuoming
  22. zhangxiaoxiang
  23. lihuoming
  24. zhangxiaoxiang
  25. lihuoming
  26. zhangxiaoxiang
  27. lihuoming

点击(此处)折叠或打开

  1. class InnerOutput{
  2.         
  3.         public void output(String name){
  4.             int len=name.length();
  5.             /**
  6.              * 用synchronized修饰方法,这段打印代码就能同步,
  7.              * 这个this,代表同一把锁,也可以用name,但是这样的话传入不同的name,就不能同步
  8.              *就算是this,创建多个InnerOutput实例,也不是同一把锁(比如创建两个放在不同的线程上           *跑),解决的话只有用类.class等共同的内存,看需求
  9.              *
  10.              * @param name
  11.              */
  12.             synchronized (this) {
  13.                 for(int i=0;i<len;i++){
  14.                     System.out.print(name.charAt(i));
  15.                 }
  16.                 System.out.println();
  17.             }
  18.             
  19.         }
  20.     }



 
 
 
阅读(711) | 评论(0) | 转发(0) |
0

上一篇:mysql存储引擎

下一篇:mysql 触发器

给主人留下些什么吧!~~