AtomicBoolean做什么,一个volatile布尔无法实现?
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)
谁能解释为什么上面的类不是线程安全的?
可能重复:
为什么要使用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) 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中多线程的新手,我做了一些代码来看看它是如何工作的.我有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());,但我假装你将来使用这个名字.并且,如果我现在删除它,结果是错误的.