Java中线程的同步问题
在生活中我们时常会遇到同步的问题,而且大多数的实际问题都是线程的同步问题
我这里以生活中的火车售票来进行举例:
假设现在我们总共有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中线程的同步问题的更多相关文章
- Java中线程同步的理解 - 其实应该叫做Java线程排队
Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可 ...
- java中线程同步的理解(非常通俗易懂)
转载至:https://blog.csdn.net/u012179540/article/details/40685207 Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运 ...
- java中线程机制
java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- Java多线程-线程的同步(同步方法)
线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...
- Java中线程和线程池
Java中开启多线程的三种方式 1.通过继承Thread实现 public class ThreadDemo extends Thread{ public void run(){ System.out ...
- Java多线程并发03——在Java中线程是如何调度的
在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
随机推荐
- lua中 table 重构index/pairs元方法优化table内存占用
转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...
- 关于EF的三种分类----CodeFirst
新建StudentInfo.cs using System; using System.Collections.Generic; using System.ComponentModel.DataAnn ...
- Linux文件权限与属性详解 之 su & sudo
Linux文件权限与属性详解 之 一般权限 Linux文件权限与属性详解 之 ACL Linux文件权限与属性详解 之 SUID.SGID & SBIT Linux文件权限与属性详解 之 ch ...
- Runtime详解(上)
这篇关于Runtime讲解参考https://juejin.im/post/593f77085c497d006ba389f0以及https://www.jianshu.com/p/6ebda3cd80 ...
- vim撤销undo与反撤销redo
普通模式下 u 撤销 ctrl + r 反撤销
- DropDownList按照Gridview获取数据获取到的是定义格式
首先需要把DropDownList改成允许服务器返回. 然后绑定的时候需要以下两项. DropDownList1.DataTextField = "name";DropDownLi ...
- T-SQL基础(五)之增删改
在前面的文章中对T-SQL的查询做了基本总结,接下来我们看下SQL中的另外一个常用操作——数据的修改. INSERT INSERT 向数据表中插入数据的基本语句,句式: INSERT INTO tab ...
- springMVC常见错误-解决org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.spring
笔者参考文档: https://blog.csdn.net/sinat_24928447/article/details/47807105 可能错误原因即解决方法: 1.配置文件错误 a)这是配置文件 ...
- 2018最新iOS端界面UI设计规范整理
在iPhone 6还没出的时候,都是用640×1136 px来做设计稿的,自从6的发布,所有的设计稿尺寸以750×1334 px来做设计稿尺寸 以750x1334px作为设计稿标准尺寸的原由: 从中间 ...
- xhr post请求
1. post提交的时候要设置post请求头,可以使用setRequestHeader(单独指定请求的某个http头) 2.通常在web开发中,使用表单提交数据的时候,一般是使用xml的格式进行的.可 ...