i++와++i가 다중 라인에서의 표현,volatile와 잠금
11607 단어 os
콘솔 출력:
i++ 결과: 1000012113++i 결과: 1000003505 volatile i++ 결과: 1018584689 volatile++i 결과: 995483979 자물쇠 i++ 결과: 2000000000 자물쇠 +i 결과: 200000000000
테스트 코드는 다음과 같습니다.
/
public class ThreadTest1 {
private static long i = 0;
private static volatile long m = 0;
public static void main(String[] args) throws Exception{
System.out.println("i++ :");
new ThreadTest1().test();
ThreadTest1.i = 0;//
System.out.println("++i :");
new ThreadTest1().test1();
ThreadTest1.i = 0;//
System.out.println("volatile i++ :");
new ThreadTest1().test2();
ThreadTest1.m = 0;//
System.out.println("volatile ++i :");
new ThreadTest1().test3();
ThreadTest1.m = 0;//
System.out.println(" i++ :");
new ThreadTest1().test4();
ThreadTest1.i = 0;//
System.out.println(" ++i :");
new ThreadTest1().test5();
ThreadTest1.i = 0;//
}
private void test() throws Exception{
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000000000; i++){
ThreadTest1.i++;
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ThreadTest1.i);
}
private void test1() throws Exception{
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000000000; i++){
++ThreadTest1.i;
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ThreadTest1.i);
}
private void test2() throws Exception{
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000000000; i++){
ThreadTest1.m++;
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ThreadTest1.m);
}
private void test3() throws Exception{
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000000000; i++){
++ThreadTest1.m;
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ThreadTest1.m);
}
private void test4() throws Exception{
Runnable runnable = new Runnable() {
@Override
public void run() {
synchronized (ThreadTest1.class){
for (int i = 0; i < 1000000000; i++){
ThreadTest1.i++;
}
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ThreadTest1.i);
}
private void test5() throws Exception{
Runnable runnable = new Runnable() {
@Override
public void run() {
synchronized (ThreadTest1.class){
for (int i = 0; i < 1000000000; i++){
++ThreadTest1.i;
}
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ThreadTest1.i);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 프로그램에서 메모리 누수를 감지하는 간단한 프로그램때때로 우리는 메모리 누수를 남기는 프로그램을 작성하는데, 그 결과 일정 시간이 지나면 프로그램이 충돌하고 메모리 누수가 어디에 남아 있는지 찾기가 매우 어렵습니다. 따라서 이러한 문제를 디버깅하기 위해 프로그램에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.