线程的资源同步问题

卖出的票为负数的情况:

class MyThread22 implements Runnable {
    private int ticket = 10;

    public void run() {
        for (int i = 0; i < 100; i++) {
            if (ticket > 0) {
                try {
                   Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Saling: ticket= " + ticket--);
            }
        }
    }
}

public class SyncDemo01 {
    public static void main(String[] args) {
        MyThread22 mt = new MyThread22();
        Thread t1 = new Thread(mt);
        Thread t2 = new Thread(mt);
        Thread t3 = new Thread(mt);
        t1.start();
        t2.start();
        t3.start();
    }
}

使用同步方法解决此问题:

class MyThread30 implements Runnable {
    private int ticket = 20;

    public void run() {
        for (int i = 0; i < 100; i++) {
            this.sale();
        }
    }

    public synchronized void sale() {
        if (ticket > 0) {
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("saling: ticket=" + ticket--);
        }
    }
}

public class SyncDemo03 {
    public static void main(String[] args) {
        MyThread30 mt = new MyThread30();
        Thread t1 = new Thread(mt);
        Thread t2 = new Thread(mt);
        Thread t3 = new Thread(mt);
        t1.start();
        t2.start();
        t3.start();
    }
}

线程的资源同步问题

时间: 2024-10-13 11:59:52

线程的资源同步问题的相关文章

好记性不如烂笔头76-多线程-通过synchronized实现资源同步

每个对象都有一个标志锁.当对象的一个线程访问了对象的某个synchronized数据(包括函数)时,这个对象就将被"上锁",被声明为synchronized的数据(包括函数)都不能被调用(因为当前线程取走了对象的"锁标志"). 只有当前线程访问完它要访问的synchronized数据,释放"锁标志"后,同一个对象的其它线程才能访问synchronized数据. 注意:每个class也有一个"锁标志".对于synchronize

C# 线程之间的同步

1.通过Join方法,暂停当前线程 Thread secondThread = new Thread(new ThreadStart(ThreadMethod)); secondThread.Start(); ... secondThread.Join(); 2.通过启动APM异步操作的方法,得到一个IAsyncResult对象,通过它有三种方法使得两个线程同步. public interface IAsynResult { object AsyncState{get; } WaitHandle

多线程下的资源同步访问

在一个应用程序中使用多线程 好处是每一个线程异步地执行. 对于Winform程序,可以在后台执行耗时操作的同时,保持前台UI正常地响应用户操作. 对于Service.对于客户端的每一个请求,可以使用一个单独的线程来进行处理.而不是等到前一个用户的请求被完全处理完毕后,才能接着处理下一个用户的请求. 同时,异步带来的问题是,必须协调对资源(文件,网络,磁盘)的访问. 否则,会造成在同一时间两个以上的线程访问同一资源,并且这些线程间相互未知,导致不可预测的数据问题. Lock/Monitor:防止线

进程 线程 多线程 并发 同步异步

进程 线程 多线程 并发 同步异步 很多人对进程,线程,多线程,并发,同步,异步等概念感到困惑,这都是大学没好好听课的缘故啊.咱在这里帮感到概念给感到困惑的同学复习下. 程序 程序用来描述计算机所完成的独立功能,并在时间上严格地按前后次序相继地进行计算机操作序列集合,是一个静态概念. 进程 并发执行的程序在执行过程中分配和管理资源的基本单位.是一个动态的执行过程. 进程的静态描述 进程控制块PCB 有关程序段 该程序员对齐进行操作的数据结构集 进程控制块PCB 进程控制块PCB是系统管制进程存在

什么是java的线程安全?同步,异步

线程是比进程更小的执行单位,是在进程基础上进行的进一步划分.所谓多线程是指进程在执行过程中可以产生多个同时存在.同时运行的线程.多进程机制可以合理利用资源,提高程序的运行效率.一个进程至少包含一个线程(JVM虚拟机的启动是多线程的,至少有两个线程:main 和垃圾回收机制). 1.什么是线程安全? 进程在运行时为了更好的利用资源提高运行效率,会产生多个线程,但是这多个线程运行时,会对同一个资源同时进行操作,也称之为线程异步,例如:线程A,B在对同一个链表进行操作时,如果出现了A对链表进行读取的同

线程创建_同步_通信

目录 1. 基本概念:程序.进程.线程 2. 并行和并发 3. 创建线程的两种方式 3.1 通过继承Thread方式 3.1.1 步骤: 3.1.2 两个问题 3.1.3 案例演示 3.2 通过实现Runnable的方式 3.2.1 步骤 3.2.2 代码演示 3.3 两种方式的比较 4. Thread类中常用方法 4.1 常用方法 4.2 线程的调度 4.3 线程的优先级 4.4 线程的分类 5. 线程的声明周期 5.1 生命周期的几个状态 5.2 线程状态转换图 6. 线程的同步 6.1 线

Java多线程——线程之间的同步

Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,以及如何使用synchronized关键字和volatile关键字. 部分内容来自以下博客: https://www.cnblogs.com/hapjin/p/5492880.html https://www.cnblogs.com/paddix/p/5367116.html https://www.cnblogs.com/paddix/p/5428507.html https://www.cnblogs.com/liu

python37 1.GIL--全局解释器锁 2.GIL带来的问题 3.为什么需要GIL 4.GIL的加锁解锁时机 5.关于GIL的性能的讨论 6.线程常用方法 7.GIL锁与自定义锁的区别 8.进程池与线程池 9.同步异步 10.异步调用

复习1.JoinableQueue--可以被join的队列2.多线程3线程的使用方法与进程一模一样3.1守护线程3.2线程安全问题3.3解决方案3.3.1互斥锁mutex3.3.2递归锁Rlock3.3.3信号量semaphore3.3.4死锁问题 详解:1.JoinableQueue--可以被join的队列 1.1join是等待任务结束 队列怎么叫结束 调用task_done一次则表示有一个数据被处理完成了,当task_done次数等于put的次数就意味着任务处理完成了 1.2这就是join的

Linux 线程间的同步与互斥

在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程,类似信号. 场景:T-DAY展会排队参观/生产者消费者模型 条件变量是什么? 是一种同步机制,一个线程用于修改这个变量使其满足其它线程继续往下执行的条件,其它线程则接收条件已经发生改变的信号. 条件变量操作? 初始化和销毁    pthread_cond_wait 条件不满足 会释放锁并阻塞等待 ,