java线程遇见的一个小问题(本质和线程无关都是基础知识)
2015-09-21 10:29
393 查看
[size=medium]猜猜下面几个程序,那个是线程安全的[/size]
[size=medium]NO1[/size]
[size=medium]NO2[/size]
[size=medium]NO3[/size]
[size=medium]NO4[/size]
[size=medium]1 no
2 yes
3 [color=red]no[/color] num=num+1,会生成另一个对象,锁就不唯一了
4 [color=red]yes[/color] Integer 会缓存 -128(固定)~127(默认可配置) 的整数,所以无论多少个Integer(0) 都是一个对象[/size]
[size=medium]NO1[/size]
public class Main {
public static class AddTest extends Thread {
private static Integer num = 0;
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
num = num + 1;
System.out.println("now num is " + num);
}
}
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
new AddTest().start();
}
}
}
[size=medium]NO2[/size]
public class Main {
public static class AddTest extends Thread {
private static Integer num = 0;
private static Object lock = new Object();
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
synchronized (lock) {
num = num + 1;
System.out.println("now num is " + num);
}
}
}
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
new AddTest().start();
}
}
}
[size=medium]NO3[/size]
public class Main {
public static class AddTest extends Thread {
private static Integer num = 0;
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
synchronized (num) {
num = num + 1;//
System.out.println("now num is " + num);
}
}
}
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
new AddTest().start();
}
}
}
[size=medium]NO4[/size]
public class Main {
public static class AddTest extends Thread {
private static Integer num = 0;
private Integer lock = 0; //-128~127
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
synchronized (lock) {
num = num + 1;
System.out.println("now num is " + num);
}
}
}
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
new AddTest().start();
}
}
}
[size=medium]1 no
2 yes
3 [color=red]no[/color] num=num+1,会生成另一个对象,锁就不唯一了
4 [color=red]yes[/color] Integer 会缓存 -128(固定)~127(默认可配置) 的整数,所以无论多少个Integer(0) 都是一个对象[/size]
相关文章推荐
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- Java并发(基础知识)—— 创建、运行以及停止一个线程
- 实训 Java基础知识---流,线程,网络编程
- Java基础知识系列:线程变量
- Java基础知识强化之IO流笔记61:标准输入输出流的本质
- Java多线程编程总结笔记——一多线程基础知识
- java基础知识回顾之java Thread类--java线程实现常见的两种方式实现Runnable接口(二)
- 黑马程序员——java基础知识篇——>线程
- java线程同步等基础知识
- java 多线程基础知识3----线程封闭
- java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
- Java核心技术卷I:基础知识(原书第8版):14.11 线程与Swing
- Java基础知识强化之IO流笔记12:递归之递归解决问题的思想(图解)
- java线程基础知识
- Java并发基础知识(内存栅栏+volatile+synchronized详解+java锁优化+wait notify+AbstractQueuedSynchronizer详解+线程中断)
- java模板 Java做acm所需要的基础知识之基本输入输出问题
- java基础---->线程 生产者消费者问题
- Java 经典问题 for 基础知识
- java基础12:线程间通信---生产者消费者问题
- java基础知识回顾之java Thread类--java线程实现常见的两种方式(一)