Java中线程的同步问题

      在生活中我们时常会遇到同步的问题,而且大多数的实际问题都是线程的同步问题

我这里以生活中的火车售票来进行举例:

  假设现在我们总共有1000张票要进行出售,共有10个出售点,那么当售票到最后只有一张票时,每个售票点如何去处理这唯一的一张票?或者对于某一张票而言,假设它正在售票站1售票的程序执行过程中,但是还没有出售,那么此时,其他售票站改如何去处理这张票呢?

  这时,应该考虑使用java中的同步机制;

方法一:使用Runnable接口实现

package thread;

public class TSynchronize {
    public static void main(String[]ages){
        int l=10;
        Syn []s=new Syn[l];
        Thread [] t=new Thread[l];
             //创建10个火车票售票点
        for(int i=0;i<l;i++){
            s[i]=new Syn();
            t[i]=new Thread(s[i]);
            t[i].setName((i+1)+"号口");
        }
            //启动线程
        for(int i=0;i<l;i++){
            t[i].start();
        }
    }

}

class Syn implements Runnable{
    private static int count=1000;  //总共的票数
    private static String key="key";

    //synchronized是为了实现同步,其中所管辖的代码块要么全执行,要不全不执行
    //synchronized如果修饰的是函数,则指调用它的函数的对象 ,它不需要字符串,默认为this;如果修饰的是代码块则需要使用字符串
    public  void run(){

        while(count>0){
            synchronized(key){    //synchronized 可以修饰函数和代码块    key 线程执行时的令牌口令,可以是任何值
                if(count>0){
                    System.out.println("第"+Thread.currentThread().getName()+"在卖第"+(1001-count)+"张票");
                    count--;
                }else{
                    break;
                }
            }
        }
        System.out.println("第"+Thread.currentThread().getName()+"的票已经卖完");
    }
}

执行结果:

    

方法二:继承Thread类:

package thread;

public class TSynClass {
    public static void main(String []ages){
        int l=10;
        Point[] p=new Point[10];

        for(int i=0;i<l;i++){
            p[i]=new Point ();
            p[i].setName((i+1)+"号口");
        }

        for(int i=0;i<l;i++){
            p[i].start();
        }
    }
}

class Point extends Thread{
    private static int count =1000;    //共享票数
    private static String key="key";    //共享线程口令,让其进行争夺

    public void run(){
        while(count>0){
            synchronized(key){    //两个线程的key是自己的,不是公共的
                if(count>0){
                    System.out.println("第"+this.currentThread().getName()+"正在买第"+(1001-count)+"张票");
                    count--;
                }else{
                    break;
                }
            }
        }

        System.out.println("第"+this.currentThread().getName()+"的票已经卖完");
    }
}

执行结果:

  

原文地址:https://www.cnblogs.com/feiquan/p/9126875.html

时间: 2024-10-08 16:27:40

Java中线程的同步问题的相关文章

Java中线程的同步与锁定

哪些需要修改变量需要同步的,就用synchronized关键字修饰 package com.ehealth.thread; class foo{ private int x=100; public int getX(){ return x; } public synchronized int fix(int y){ x=x-y; System.out.println("Thread :"+Thread.currentThread().getName()+ " Thread e

java中线程的同步

线程同步: 当有两个进程并发修改同一文件时就可能造成异常. 意思就是当一个线程要改变一个文件的内容时,却sleep了一段时间,这时另一个线程却改变了这个文件的内容.最后就会出现错误的结果. 为了解决这个问题,java多线程支持引入了同步监视器来解决这个问题.使用同步监视器的通用方法就是同步代码块. 同步代码块的语法格式如下: synchronized(obj){ ······ //此处的代码就是同步代码块 } 上面语法格式中synchronized后括号里的obj就是同步监视器,上面代码的含义是

Java中线程同步的理解 - 其实应该叫做Java线程排队

Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程"同步"机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize(使同时发生)翻译过来的.我也不明白为什么

Java中线程封闭之ThreadLocal

在访问共享数据时通常使用同步.若不使用同步则可以将对象封闭在一个线程中达到线程安全的目的,该方法称为线程封闭(Thread Confinement).其中实现线程封闭中规范的方法是使用ThreadLocal类.线程封闭技术一种常用的使用场景是在JDBC Connection对象. public class ConnectionHelper{private final static String URL = "";private final static ThreadLocal<C

java中线程存活和线程执行的问题!

1 /* 2 下面的程序会出现下面的情况,当Thread-0, Thread-1, Thread-2都被wait的时候,可能会同时苏醒 3 Thread-0 put 4 Thread-1 put 5 Thread-2 put 6 Thread-3 get//在此处,Thread-3拿到锁之后,将所有的等待的线程唤醒,才有了下面的输出 7 Thread-2 put 8 Thread-1 put 9 Thread-0 put 10 */ 11 12 13 虽然多个线程会同时苏醒,但是只有一个能获得c

java的线程问题同步与互斥

以前学过java的线程,但是当时对Tread的理解不是很深,对于里面的同步与互斥,生产者与消费者问题,理解的不够深入,这次又从新学习java的多线程,感觉对线程的理解更加的深入了,觉得有必要写下博客记录下. 本文原创,转载请著明:http://blog.csdn.net/j903829182/article/details/38420503 1.java实现线程的方法: 1.实现Runnable接口,重写run方法,通过Thread的start方法启动线程.这种方法可以实现资源的共享 2.继承T

Java中线程(Thread)知识概括

Java中线程(Thread)知识概括 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程. 例如:Java VM 启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中.该线程称之为主线程.jvm启动不止一个线程,还有负责垃圾回收机制等线程. 如何在自定义的代码中,自定义一个线程呢

多线程(三) java中线程的简单使用

============================================= 原文链接:多线程(三) java中线程的简单使用 转载请注明出处! ============================================= java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依旧是实现了Runnabel接口.考虑到java的

线程的生命周期 - 理解Java中线程的状态

刚刚开始学cocos2-x,仅仅是按照教程把已经安了一般Android的开发环境的eclipse重新升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 参考博客 D:\cocos2d-x\cocos2d-x-2.2.3\cocos2dx\platform\third_party\android\prebuilt 说说大概的过程: 下载ndk插件,ndk包,cdt插件.最开始我按照书上的下载了cocos2d-x 2.0.1,希望跟书上统一起来,这样以后学习的时候可以参考书上的也不会遇到太