黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: Ricky_Nick    时间: 2014-4-25 10:42
标题: 多线程问题
设计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();
}
}
}
}

作者: 朱晓盼    时间: 2014-4-25 11:05
哥们,你把代码排版下吧,虽然你复制粘贴很省事,但是别人看你这样的代码很痛苦的:dizzy:
作者: ilvsoft    时间: 2014-4-25 15:49
这书写台整齐了,整齐的都不想看啊,注意书写格式
作者: 你为谁归来    时间: 2014-4-25 16:22
  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就是负数)。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2