36. 解决线程问题方式一(同步代码块synchronized)
解决线程问题:
方式一:同步代码块(synchronized)
语法:
synchronized ("锁对象") {
//需要锁定的代码
}
解决线程安全问题原理:
当我们使用同步代码块时,就当与给此段语句上了一个锁,当一个线程A进去的时候,锁的状态会从开变成关,后面的线程是进不来的。
当进去的线程A执行完里面的代码时,锁的状态才会从关变成开,后面的线程才能进来。
同步代码块需要注意事项:
1.任何一个对象都可以作为一个锁对象
2.在同步代码块中调用sleep对象并不是释放锁对象
3.只有在正真需要使用代码块时才使用,否则会降低效率
4.多线程操作的所对象必须时唯一共享的。否者无效
5.锁住的代码最好是操作同一个共享资源的代码
修改代码如下:
//模拟3个窗口同时售票
class SaleTicket extends Thread{
//定义票数
static int num = 50;
public SaleTicket(String name) {
super(name);
}
@Override
public void run() {
while (true) {
if(num>0) {
synchronized ("票数") {
System.out.println(Thread.currentThread().getName()+"买了"+num+"号票");
num--;
}
}else {
System.out.println(Thread.currentThread().getName()+"票卖完了");
break;
}
}
}
} public class Demo5 {
public static void main(String[] args) {
SaleTicket sale1 = new SaleTicket("窗口1");
SaleTicket sale2 = new SaleTicket("窗口2");
SaleTicket sale3 = new SaleTicket("窗口3");
sale1.start();
sale2.start();
sale3.start(); }
}
36. 解决线程问题方式一(同步代码块synchronized)的更多相关文章
- java多线层同时运行的解决,同步代码块synchronized
/* 多个线层同时操作一个数据 会导制数据超出 同步代码块 synchronized(对像) { 需要同步的代码 } */ class Do7 { public static void main(St ...
- java 线程 (三)线程并发的安全性 同步代码块
package cn.sasa.demo1; import java.util.concurrent.ExecutionException; public class ThreadDemo { pub ...
- 彻底理解线程同步与同步代码块synchronized
public class Demo { public static synchronized void fun1(){ } public synchronized void fun2(){ } pub ...
- java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader
1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...
- Java 同步代码块 - Synchronized Blocks
java锁实现原理: http://blog.csdn.net/endlu/article/details/51249156 The synchronized keyword can be used ...
- 线程同步 synchronized 同步代码块 同步方法 同步锁
一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...
- Java基础8-多线程;同步代码块
作业解析 利用白富美接口案例,土豪征婚使用匿名内部类对象实现. interface White{ public void white(); } interface Rich{ public void ...
- Java之同步代码块处理实现Runnable的线程安全问题
/** * 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式 * * 1.问题:卖票过程中,出现了重票.错票 -->出现了线程的安全问题 * 2.问题出现的原因:当某 ...
- 线程的同步机制:同步代码块&同步方法
解决存在的线程安全问题:打印车票时出现重票,错票 使用同步代码块的解决方案 TestWindow2 package com.aff.thread; /* 使用实现Runnable接口的方式,售票 存在 ...
随机推荐
- MS14-068利用
漏洞原理详情后续补上:kerberos 协议实现过程中的某些 bug,致使普通域用户可以任意伪造高权限 PAC,去请求 TGS 从而导致的权限提升,漏洞现在很少遇到了. 一.利用 需要拥有一个域账号的 ...
- codeforces 1182E Product Oriented Recurrence 矩阵快速幂
题意:设f(n) = c ^ (2n - 6) * f(n - 1) * f(n - 2) * f(n - 3), 问第n项是多少? 思路:官方题解:我们先转化一下,令g(x) = c ^ x * ...
- 分分钟教你学会 ToolBar 的使用(转)
转自:http://blog.csdn.net/itguangit/article/details/52042203 1.和平常一样,新建一个Moudle 在xml布局文件中使用 Toolbar 控件 ...
- git命令的基本使用
git init 创建仓库 git status 查看当前版本库的状态 git add filename 使用git add命令告诉git,把该文件添加到仓库 git commit -m 'c ...
- react-native run-android出现红屏错误
react-native run-android出现 unable to load script from assets 'index.android.bundle'.Make sure your b ...
- es的日期格式
https://www.elastic.co/guide/en/elasticsearch/reference/2.3/mapping-date-format.html 在es中,默认的时间类型为da ...
- MyBatis 通过包含的jdbcType类型
BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL V ...
- Java高并发网络编程(五)Netty应用
推送系统 一.系统设计 二.拆包和粘包 粘包.拆包表现形式 现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下: 第一种情 ...
- QT之sqlite连接
啥也没做,按说明直接啪啪写一堆代码 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //open datebase ...
- VMware Network Adapter VMnet1/8详解
转自:https://www.cnblogs.com/systemnet123/articles/2640883.html VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网 ...