`
shifulong
  • 浏览: 59179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java线程遇见的一个小问题(本质和线程无关都是基础知识)

    博客分类:
  • java
阅读更多
猜猜下面几个程序,那个是线程安全的
NO1
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();

        }
    }
}

NO2
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();

        }
    }
}

NO3
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();

        }
    }
}

NO4
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();

        }
    }
}


1 no
2 yes
3 no num=num+1,会生成另一个对象,锁就不唯一了
4 yes  Integer 会缓存 -128(固定)~127(默认可配置) 的整数,所以无论多少个Integer(0) 都是一个对象
分享到:
评论

相关推荐

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java线程实例 各种小Demo

    在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台服务。 一、线程的创建方式 Java提供了多种创建线程的方式: 1. 继承Thread类:创建一个新的类,继承...

    Java线程基础知识

    总结来说,Java线程基础知识涵盖的内容丰富,从线程的基本概念,到线程在程序中的应用,再到线程间的通信和同步机制,都是多线程编程中不可或缺的一部分。掌握这些知识对于开发高性能、多任务并行处理的应用程序具有...

    java多线程的讲解和实战

    - 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...

    Java线程.ppt

    Java线程是Java编程中的重要概念,特别是在多核处理器和并发处理中不可或缺。Java线程允许程序在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在燕山大学信息学院计算机系的课程中,李峰教授讲解了...

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    Java线程基础教程完整版

    通过深入学习和实践这些Java线程基础知识,你可以有效地编写出高效、安全的多线程程序。记住,理解线程的原理和掌握同步机制是关键,这将有助于解决复杂的并发问题。阅读"Java线程.pdf"文档,你将获得更详细、全面的...

    Java线程详解大全

    总之,Java线程是并发编程的基础,理解和掌握线程的生命周期、实现方式和同步机制对于编写高效、安全的多线程程序至关重要。在实际应用中,根据需求选择合适的线程实现策略,并结合同步机制,可以有效地利用系统资源...

    Java多线程机制(讲述java里面与多线程有关的函数)

    每个Java程序都有一个主线程,即由JVM启动并执行main方法的线程。线程代表了程序中的执行流,可以在不同的线程之间切换以共享CPU时间。线程的状态包括新建、运行、中断和死亡。线程的生命周期始于新建,通过调用...

    java线程深入解析

    本文将深入解析Java线程的相关知识点,包括线程的定义、创建、状态管理、线程同步和安全问题。 1. **线程定义** 在Java中,线程是进程中的单一顺序控制流,是程序执行的基本单元。线程在进程的上下文中运行,共享...

    JAVA编写的多线程小弹球测试

    在“JAVA编写的多线程小弹球测试”项目中,开发者利用Java语言创建了一个生动有趣的多线程应用,即一个模拟小弹球运动的程序。这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示...

    关于线程(java)两天的课件

    每个线程都有一个优先级,范围从1(MIN_PRIORITY)到10(MAX_PRIORITY),默认值是5(NORM_PRIORITY)。然而,优先级高的线程并不一定先执行,这取决于操作系统的线程调度策略。 线程池是Java中处理大量并发线程的...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...

    java线程分析工具TDA

    当应用程序出现性能问题或疑似死锁时,开发者通常会使用`jstack`命令来生成线程堆栈,这是一个内置在JDK中的命令行工具。 TDA的使用流程如下: 1. **生成线程堆栈**:首先,你需要通过`jstack`命令对目标Java进程...

    java多线程基础知识

    Java多线程基础知识是Java编程语言中的一项重要技术,用于提高程序的执行效率和响应速度。在这里,我们将详细介绍Java多线程基础知识的相关概念和技术。 一、程序、进程和线程 程序(Program)是一段静态的代码,...

    java线程理解小程序

    然而,对于复杂的后台任务,推荐使用`Handler`、`Looper`和`HandlerThread`,它们可以创建一个后台线程,处理耗时操作,并通过消息机制将结果发送回主线程进行UI更新。 网络通信在Android中通常使用`...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统...以上介绍的是Java线程的基础知识,更多高级特性和最佳实践将在后续的学习中逐渐深入。

    Java线程状态流转图

    Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...

Global site tag (gtag.js) - Google Analytics