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

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

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

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

方法一:使用Runnable接口实现

package thread;

public class TSynchronize {
public static void main(String[]ages){
int l=;
Syn []s=new Syn[l];
Thread [] t=new Thread[l];

     //创建10个火车票售票点
for(int i=;i<l;i++){
s[i]=new Syn();
t[i]=new Thread(s[i]);
t[i].setName((i+)+"号口");
}

    //启动线程
for(int i=;i<l;i++){
t[i].start();
}
} } class Syn implements Runnable{
private static int count=;  //总共的票数
private static String key="key"; //synchronized是为了实现同步,其中所管辖的代码块要么全执行,要不全不执行
//synchronized如果修饰的是函数,则指调用它的函数的对象 ,它不需要字符串,默认为this;如果修饰的是代码块则需要使用字符串
public void run(){ while(count>){
synchronized(key){ //synchronized 可以修饰函数和代码块 key 线程执行时的令牌口令,可以是任何值
if(count>){
System.out.println("第"+Thread.currentThread().getName()+"在卖第"+(-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()+"的票已经卖完");
}
}

执行结果:

  

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

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

    Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可 ...

  2. java中线程同步的理解(非常通俗易懂)

    转载至:https://blog.csdn.net/u012179540/article/details/40685207 Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运 ...

  3. java中线程机制

    java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...

  4. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  5. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

  6. Java中线程和线程池

    Java中开启多线程的三种方式 1.通过继承Thread实现 public class ThreadDemo extends Thread{ public void run(){ System.out ...

  7. Java多线程并发03——在Java中线程是如何调度的

    在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...

  8. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  9. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

随机推荐

  1. 一些不常用但又很有用的css小tips

    1.box-sizing:border-box box-sizing有三个属性:content-box(默认值) || border-box || inhreit.第一个自然不用说,比如我们设置一个d ...

  2. ui2code中的深度学习+传统算法应用

    背景 在之前的文章中,我们已经提到过团队在UI自动化这方面的尝试,我们的目标是实现基于 单一图片到代码 的转换,在这个过程不可避免会遇到一个问题,就是为了从单一图片中提取出足够的有意义的结构信息,我们 ...

  3. go os/exec执行外部程序

    Go提供的os/exec包可以执行外部程序,比如调用系统命令等. 最简单的代码,调用pwd命令显示程序当前所在目录: package main import ( "fmt" &qu ...

  4. spring学习(一) ———— IOC讲解

    spring基本就两个核心内容,IOC和AOP.把这两个学会了基本上就会用了. --WH 一.什么是IOC? IOC:控制反转,通俗点讲,将对象的创建权交给spring,我们需要new对象,则由spr ...

  5. Flask入门第二天

    一.请求钩子 在客户端和服务器交互的过程中,有些准备工作或稍微工作是需要处理的,比如:在请求开始时,建立数据库连接:在请求开始时,根据需求进行权限校验:在请求结束时,指定数据的交互格式等.为了让每个视 ...

  6. LeetCode哈希表

    1. Two Sum https://leetcode.com/problems/two-sum/description/ 不使用额外空间需要n*n的复杂度 class Solution { publ ...

  7. .NET Framework 平台构造基础

    CLR 公共语言运行库 执行给定编译代码单元所需的外部服务集合,它提供了一个定义明确的运行库层,可以被支持.NET的所有语言和平台所共享. 库 mscoree.dll:公共对象运行库执行引擎 当用户程 ...

  8. Android Studio 杀掉当前进程

    android.os.Process.killProcess( android.os.Process.myPid());

  9. PHP定界符eof 的使用

    PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话, 肯定要有大量的转义符来对字符串中的引号等 ...

  10. Elasticsearch系列(2):安装Elasticsearch(Linux环境)

    系统环境 操作系统:CentOS 6.9 Elasticsearch:6.2.2 Filebeat:6.2.2(收集IIS日志) Kibana:6.2.2 Java:Java 8 注意:elk最好选择 ...