`
shifulong
  • 浏览: 60207 次
  • 性别: 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开发者至关重要,尤其对初学者来说,是掌握高级编程技巧的基础。 首先,我们需要...

    java线程实例 各种小Demo

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

    Java线程基础知识

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

    java多线程的讲解和实战

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

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    java多线程经典案例

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

    Java线程基础教程完整版

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

    Java线程详解大全

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

    java线程深入解析

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

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

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

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

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

    java多线程基础知识

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

    java线程理解小程序

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

    java线程入门级书籍

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

    java线程分析工具TDA

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

    Java线程状态流转图

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

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    JAVA线程学习(源代码)

    总的来说,"JAVA线程学习(源代码)"涵盖了Java线程的基础知识和高级特性,包括线程的创建、管理、同步和通信。通过分析和实践这些源代码,你可以深入了解Java并发编程的精髓,提高你的多线程编程能力。

    java线程文档大全

    在Java中,一个进程可以拥有多个线程。 2. **线程创建**:Java提供两种方式创建线程,一是直接继承Thread类并重写run()方法,二是实现Runnable接口并定义run()方法,然后通过Thread类的构造函数将Runnable对象传递...

    基于java多线程的一款小游戏.zip

    基于java多线程的一款小游戏基于java多线程的一款小游戏基于java多线程的一款小游戏 基于java多线程的一款小游戏基于java多线程的一款小游戏基于java多线程的一款小游戏 基于java多线程的一款小游戏基于java多线程的...

Global site tag (gtag.js) - Google Analytics