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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Ricky_Nick 中级黑马   /  2014-4-25 10:42  /  1275 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。朋友说我我这个设计有安全问题,我觉得已经没什么问题了,谁帮忙看看…………
public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
}
}

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

3 个回复

倒序浏览
哥们,你把代码排版下吧,虽然你复制粘贴很省事,但是别人看你这样的代码很痛苦的:dizzy:
回复 使用道具 举报
这书写台整齐了,整齐的都不想看啊,注意书写格式
回复 使用道具 举报
  1. public class ThreadTest1{
  2.         private int j;
  3.         public static void main(String args[])
  4.         {
  5.                 ThreadTest1 tt=new ThreadTest1();
  6.                 Inc inc=tt.new Inc();
  7.                 Dec dec=tt.new Dec();
  8.                 for(int i=0;i<2;i++)
  9.                 {
  10.                         Thread t=new Thread(inc);
  11.                         t.start();
  12.                         t=new Thread(dec);
  13.                         t.start();
  14.                 }
  15.         }
  16.         private synchronized void inc()
  17.         {
  18.                 j++;
  19.                 System.out.println(Thread.currentThread().getName()+"-inc:"+j);
  20.         }
  21.         private synchronized void dec()
  22.         {
  23.                 j--;
  24.                 System.out.println(Thread.currentThread().getName()+"-dec:"+j);
  25.         }
  26.         class Inc implements Runnable
  27.         {
  28.                 public void run(){
  29.                         for(int i=0;i<100;i++)
  30.                         {
  31.                                 inc();
  32.                         }
  33.                 }
  34.         }
  35.         class Dec implements Runnable
  36.         {
  37.                 public void run()
  38.                 {
  39.                         for(int i=0;i<100;i++)
  40.                         {
  41.                                 dec();
  42.                         }
  43.                 }
  44.         }
  45. }
复制代码


我整理了一下,但从运行上面看是不存在安全问题的。虽然操作的是一个变量,但是由于你对这个变量没有要求也就没有什么相关的安全问题。但是要是应用在某些事情上就不行了。比如票,怎么会有负数呢。(当j--先执行的时候j就是负数)。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马