相关疑难解决方法(0)

224
推荐指数
11
解决办法
9万
查看次数

为什么这个类不是线程安全的?

class ThreadSafeClass extends Thread
{
     private static int count = 0;

     public synchronized static void increment()
     {
         count++;
     }

     public synchronized void decrement()
     {
         count--;
     }
}
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么上面的类不是线程安全的?

java multithreading thread-safety

94
推荐指数
5
解决办法
9157
查看次数

getter方法的必要性

可能重复:
为什么要使用getter和setter?

这是一个新手问题.是否非常有必要使用getmethods来访问属性值?分配值后,可以获取值目录.例如,在下面的代码中,displayName()可以显示firstName值而无需任何getter方法的帮助.或者它是一个标准的编码标准,必须有getter和setter方法或任何其他方法给出该值?

class Test{

    private String firstName;

    public void setName(String fname){
        firstName = fname;
    }

    public void displayName() {
        System.out.println("Your name is " + firstName);
    }
}          
Run Code Online (Sandbox Code Playgroud)

java

9
推荐指数
1
解决办法
276
查看次数

Java volatile变量的行为不正确.

public class MyThread
{
    volatile static int i;

    public static class myT extends Thread
    {
        public void run ()
        {
            int j = 0;
            while(j<1000000){
                i++;
                j++;
            }
        }
    }

    public static void main (String[] argv)
    throws InterruptedException{
            i = 0;

            Thread my1 = new myT();
            Thread my2 = new myT();
            my1.start();
            my2.start();

            my1.join();
            my2.join();

            System.out.println("i = "+i);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于在关系之前发生了易失性构建,因此i的最终值应该严格为2000000.但是,实际结果与变量i没有volatile的情况没有什么不同.任何人都可以解释为什么它在这里不起作用?由于i被声明为volatile,因此应该保护它不受内存不一致的影响.

java concurrency volatile

6
推荐指数
1
解决办法
361
查看次数

JAVA中多线程的全局总和错误

我是Java中多线程的新手,我做了一些代码来看看它是如何工作的.我有global = 0一个全局的int变量,并且有一个for循环我初始化了很多线程(100)以将1添加到我的全局变量中.
在代码的最后,结果应该是100,但不是.我有时在代码末尾99或任何其他数字(大约100).所以我的问题是,为什么线程在他们之间"打架"并且不能使总和正确?

public class test extends Thread {
    public static int global =0;
    public static void main(String[] args) throws Exception {
                for(int i=0;i<100;i++){
                String stream = String.valueOf(i);
                new test2(stream).start();
                }
                Thread.sleep(1000);
                System.out.println(global);
    }
    public test(String str) {
        super(str);
    }
    public void run() {
        int a = Integer.parseInt(getName());
        global = global+1;
        System.out.println("El hilo "+a+" tiene el número "+global);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我不需要int a = Integer.parseInt(getName());,但我假装你将来使用这个名字.并且,如果我现在删除它,结果是错误的.

java

3
推荐指数
2
解决办法
356
查看次数