JAVA线程安全之synchronized关键字的正确用法_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3897 | 回复: 0   主题: JAVA线程安全之synchronized关键字的正确用法        下一篇 
    本主题由 koei 于 2012-2-15 19:29:10 移动
barry
注册用户
等级:中校
经验:1534
发帖:236
精华:2
注册:2012-1-13
状态:离线
发送短消息息给barry 加好友    发送短消息息给barry 发消息
发表于: IP:您无权察看 2012-2-14 10:17:05 | [全部帖] [楼主帖] 楼主

JAVA线程安全关于synchronized关键字的用法,今天才知道原来我一直错了。以为用了synchronized关键字包住了代码就可以线程同步安全了。

测试了下。发现是完全的错了。synchronized必须正确的使用才是真正的线程安全。。。虽然知道这种写法,一直以为却由于懒而用了错误的方法。

看来基础还没有打好。仍需复习加强!工作中犯这种错误是不可原谅的,要知道使用synchronized关键字的地方都是数据敏感的!汗一把。。。

先贴代码:

[java]view plaincopyprint?

  1. package com; 
  2. publicclass ThreadTest { 
  3.       publicstaticvoid main(String[] args) { 
  4.              MyThread m1 = new MyThread(1); 
  5.              MyThread m2 = new MyThread(2); 
  6.              m1.start(); 
  7.              m2.start(); 
  8.        } 
  9. finalclass MyThread extends Thread { 
  10.       privateint val; 
  11.       
  12.       public MyThread(int v) { 
  13.              val = v; 
  14.        } 
  15.       //这种做法其实是非线程安全的 
  16.       publicsynchronizedvoid print1(int v) { 
  17.             for (int i = 0; i < 100; i++) { 
  18.                    System.out.print(v); 
  19.              } 
  20.        } 
  21.       
  22.       publicvoid print2(int v) { 
  23.             //线程安全 
  24.             synchronized (MyThread.class) { 
  25.                   for (int i = 0; i < 100; i++) { 
  26.                          System.out.print(v); 
  27.                    } 
  28.              } 
  29.        } 
  30.       
  31.       publicvoid run() { 
  32.              print1(val); 
  33.             // print2(val); 
  34.        } 

package com; public class ThreadTest { public static void main(String[] args) { MyThread m1 = new MyThread(1); MyThread m2 = new MyThread(2); m1.start(); m2.start(); } } final class MyThread extends Thread { private int val; public MyThread(int v) { val = v; } //这种做法其实是非线程安全的 public synchronized void print1(int v) { for (int i = 0; i < 100; i++) { System.out.print(v); } } public void print2(int v) { //线程安全 synchronized (MyThread.class) { for (int i = 0; i < 100; i++) { System.out.print(v); } } } public void run() { print1(val); // print2(val); } }


还是为了偷懒,汗一把。。。程序员总是懒的吧。能少写就少写。我把MyThread写成了一个匿名的最终的内部类,方便调用。它用了最直接的继承Thread来实现一个线程类,定义需要运行的run()方法。

首先注释了print2()方法,看看print1()的结果如何。print1()是一个使用了synchronized关键字定义的方法,我一直以为这样也可以实现线程安全。殊不知,我错了。

我们来直接运行main()方法。控制台打印结果如下:

1212111121212121212121212121212121212121222222212121212。。。


是一连串1和2交叉打印的结果。而我main方法中是先运行m1再运行m2的,显示没有做到线程同步!




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论