A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

魏秀盛

中级黑马

  • 黑马币:0

  • 帖子:27

  • 精华:0

© 魏秀盛 中级黑马   /  2012-12-5 18:36  /  798 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚刚在看张老师讲解的线程同步锁视频,遇到一个疑问,发上来大家共同探讨下:
代码如下:
  1. package cn.andy.java.thread;

  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;

  4. public class LockTest {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 new LockTest().init();
  10.                

  11.         }
  12.         public void init(){
  13.                 final Outputer output=new Outputer();
  14.                 new Thread(new Runnable() {
  15.                        
  16.                         @Override
  17.                         public void run() {
  18.                                 while(true){
  19.                                 try {
  20.                                         Thread.sleep(10);
  21.                                 } catch (Exception e) {
  22.                                         // TODO: handle exception
  23.                                 }
  24.                                 output.output("andy.wei");
  25.                         }
  26.                         }
  27.                 }).start();
  28.                 new Thread(new Runnable() {
  29.                        
  30.                         @Override
  31.                         public void run() {
  32.                                 while(true){
  33.                                 try {
  34.                                         Thread.sleep(10);
  35.                                 } catch (Exception e) {
  36.                                         // TODO: handle exception
  37.                                 }
  38.                                 output.output2("cindy.li");
  39.                         }
  40.                         }
  41.                 }).start();
  42.         }
  43.         static class Outputer{
  44.                 Lock lock=new ReentrantLock();
  45.                 public void output(String name){
  46.                         int len=name.length();
  47.                         lock.lock();
  48.                         try {
  49.                                 for (int i = 0; i < len; i++) {
  50.                                         System.out.print(name.charAt(i));
  51.                                 }
  52.                                 System.out.println();
  53.                         } catch (Exception e) {
  54.                                
  55.                         }finally{
  56.                                 lock.unlock();
  57.                         }
  58.                 }
  59.                 public synchronized  void output2(String name){
  60.                         int len=name.length();
  61.                         //lock.lock();
  62.                         try {
  63.                                 for (int i = 0; i < len; i++) {
  64.                                         System.out.print(name.charAt(i));
  65.                                 }
  66.                                 System.out.println();
  67.                         } catch (Exception e) {
  68.                                 // TODO: handle exception
  69.                         }
  70. //                        finally{
  71. //                                lock.unlock();
  72. //                        }
  73.                        
  74.                 }
  75.                 public static synchronized void output3(String name){
  76.                         int len=name.length();
  77.                        
  78.                                 for (int i = 0; i < len; i++) {
  79.                                         System.out.print(name.charAt(i));
  80.                                 }
  81.                                 System.out.println();
  82.                 }
  83.         }

  84. }
复制代码
output方法我用的是锁,output2中用的是同步关键字,测试打印的时候出现output中的未打印完成就开始了output2中的打印输出,导致数据打印不完整,有点疑惑,大家一起帮忙看看吧,谢谢。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马