`

多线程学习

 
阅读更多

1.不同步可能导致公共资源分配不对的情况

class SaleTicketThread implements Runnable {
    private int ticket = 10;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (ticket > 0) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("还剩" + ticket-- + "张票");
            }
        }
    }
}

public class NoSynchronized {
    public static void main(String[] args) {
        SaleTicketThread saleTicketThread = new SaleTicketThread();
        for (int i = 0; i < 3; i++) {
            Thread thread = new Thread(saleTicketThread);
            thread.start();
        }
    }

}

结果:

还剩10张票

还剩9张票

还剩8张票

还剩7张票

还剩6张票

还剩5张票

还剩4张票

还剩3张票

还剩2张票

还剩1张票

还剩0张票

还剩-1张票

 

 

加上synchronized同步来保证资源

class SaleTicketThread2 implements Runnable {
    private int ticket = 10;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (this) {
                if (ticket > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("还剩" + ticket-- + "张票");
                }
            }
        }
    }
}

public class HaveSynchronized {
    public static void main(String[] args) {
        SaleTicketThread2 saleTicketThread2 = new SaleTicketThread2();
        for (int i = 0; i < 4; i++) {
            Thread thread = new Thread(saleTicketThread2);
            thread.start();
        }
    }
}

 

结果:

还剩10张票

还剩9张票

还剩8张票

还剩7张票

还剩6张票

还剩5张票

还剩4张票

还剩3张票

还剩2张票

还剩1张票

 

2.死锁

class ZhangSan {
    public void say() {
        System.out.println("李四,你给我画,我给你书");
    }

    public void get() {
        System.out.println("张三得到画了");
    }
}


class Lisi {
    public void say() {
        System.out.println("张三,你给我书,我给你画");
    }

    public void get() {
        System.out.println("李四得到书了");
    }
}

public class DeadLock implements Runnable {
    private static ZhangSan zhangSan = new ZhangSan();
    private static Lisi lisi = new Lisi();
    private boolean flag = false;

    public DeadLock(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if (flag) {
            synchronized (zhangSan) {
                zhangSan.say();
                try {
                    Thread.sleep(0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lisi) {
                    lisi.get();
                }
            }
        } else {
            synchronized (lisi) {
                lisi.say();
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (zhangSan) {
                    zhangSan.get();
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock deadLock1 = new DeadLock(true);
        DeadLock deadLock2 = new DeadLock(false);
        Thread thread1 = new Thread(deadLock1);
        Thread thread2 = new Thread(deadLock2);
        thread1.start();
        thread2.start();
    }

}

 

结果:

李四,你给我画,我给你书

张三,你给我书,我给你画

......

 

3.suspend,resume,stop都有可能导致死锁,用标志位来结束进程

class SellProduct implements Runnable {
    private boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while (flag) {
            System.out.println(Thread.currentThread().getName() + "运行,i = " + (i++));
        }
    }

    public void stopSell() {
        flag = false;
    }
}

public class StopThread {

    public static void main(String[] args) {
        SellProduct sellProduct = new SellProduct();
        Thread thread = new Thread(sellProduct);
        thread.start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        sellProduct.stopSell();
    }
}

 

分享到:
评论

相关推荐

    关于C# 多线程学习

    关于C#多线程学习,本篇将深入探讨在C#中如何管理和操作线程,包括启动、停止、暂停线程、调整线程优先级等关键知识点。 ### 启动线程 在C#中,启动一个新线程通常通过`Thread`类实现。创建一个新的线程对象时,...

    多线程学习笔记

    多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...

    C#多线程学习(一)

    C#多线程学习(一) 本篇文章将深入探讨C#中的多线程机制,涵盖了多线程的相关概念、进程、线程、多线程的好处和不利方面等。 一、什么是进程? 一个进程是指运行中的程序,包括程序所使用到的内存和系统资源。...

    多线程学习文档

    ### 多线程学习文档知识点总结 #### 一、线程的基本概念及关系 ##### 进程(Process) - **定义**:进程是Windows系统中的一个基本概念,它包含了运行程序所需的所有资源。 - **特性**: - 相对独立性:一个进程...

    java多线程学习资料

    ### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...

    corejava多线程学习总结.pdf

    ### CoreJava多线程学习总结 #### 一、基本概念 多线程是现代软件开发中非常重要的一个概念,尤其在Java这样的高级编程语言中,它使得程序能够更高效地利用计算机资源,实现并发处理任务。为了更好地理解CoreJava...

    C#多线程学习(二)

    【C#多线程学习(二)】 在C#编程中,多线程是一个重要的概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在本篇文章中,我们将深入探讨如何操纵线程,包括线程的状态以及线程优先级。 首先,...

    C++多线程学习

    在"C++多线程学习"这个主题中,我们主要探讨的是如何在C++环境中创建和管理线程,以及解决并发访问时可能出现的问题。 一、C++11及后续版本中的多线程支持 自C++11标准开始,C++提供了内置的多线程库`&lt;thread&gt;`,...

    多线程学习汇总资料,多线程学习汇总资料,

    多线程是计算机编程中的...这个学习汇总资料将涵盖以上提到的各个知识点,通过实例解析、代码示例和经典问题分析,帮助你深入理解多线程编程,提升并发编程能力。无论你是初学者还是经验丰富的开发者,都可以从中受益。

    Java多线程学习Java多线程学习Java多线程学习Java多线程学习.txt

    Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java...

    c# 多线程学习资料

    C#中的多线程是程序设计中的重要概念,特别是在现代计算环境中,多核处理器和并发执行的需求使得多线程成为了优化性能的关键技术。在C#中,多线程的运用可以提升程序的并发能力,充分利用硬件资源,提高CPU的利用率...

    C#多线程学习,学习多线程好资料。

    ### C#多线程学习详解 #### 一、多线程的基本概念 ##### 1. 什么是进程? 进程是程序的一次动态执行过程,它包含了正在运行的程序所需的内存、系统资源以及执行上下文。简单来说,当你启动一个程序时,操作系统会...

    Linux多线程学习

    最后,"Linux多线程学习(五)"可能对这些知识进行了综合应用或者讨论了高级话题,如死锁预防和线程池的实现。 掌握这些多线程编程技术对于开发高效的Linux应用程序至关重要,无论是系统编程、网络服务还是并行计算...

    java多线程学习-ftp上传

    Java多线程学习是编程领域中的重要一环,特别是在服务器端和网络编程中,多线程技术能够有效地利用系统资源,提高程序的并发性。FTP(File Transfer Protocol)上传则是通过网络将本地文件传输到远程服务器的过程。...

    java多线程学习

    在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...

    JAVA多线程学习内容

    总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...

    labview多线程学习

    多线程学习在LabVIEW中的核心概念: 1. **线程与并行执行**:线程是程序中的执行单元,一个进程可以包含一个或多个线程。在LabVIEW中,多线程允许同时执行多个任务,实现程序的并行处理,提高系统的响应速度和整体...

    多线程学习资源

    多线程概述,past,coolie,多线程控制,多线程验证码

Global site tag (gtag.js) - Google Analytics