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接口的方式,售票 存在 ...
随机推荐
- Jmeter的安装与环境配置
1.首先从jmeter的官网http://jmeter.apache.org/download_jmeter.cgi下载jmeter,目前最新版本为5.1,支持的JDK为1.8.. 然后进行解压. 2 ...
- json数据返回数字,页面显示文字处理
var obj = { 1:'你好1', 2:'你好2', 3:'你好3' } var e = obj[1]; e; //'你好1'
- 同步类容器和并发类容器——ConcurrentMap、CopyOnWrite、Queue
一 同步类容器同步类容器都是线程安全的,但在某些场景中可能需要加锁来保证复合操作. 符合操作如:迭代(反复访问元素,遍历完容器中所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).条件运算. ...
- 【JavaWeb项目】一个众筹网站的开发(七)后台用户菜单
mvn命令不能运行: jar-war-pom之间是可以直接写,优先找这个工程,而不是仓库的位置 pom-pom子父关系,需要去仓库中找,我们需要使用<relativePath>../pro ...
- Java自定义注解Annotation的使用
从 jdk5开始,Java增加了对元数据的支持,也就是Annotation,Annotation其实就是对代码的一种特殊标记,这些标记可以在编译,类加载和运行时被读取,并执行相应的处理.当然刚刚说了, ...
- idea关联git后 Git上传项目提示Push rejected: Push to origin/master was rejected解决办法
当所有的东西都配好以后 就是不上数据 解决方案是在所属右键 点击Git BashHere后 输入:git pull origin master –allow-unrelated-historie ...
- AcWing 156. 矩阵 (哈希二维转一维查询)打卡
给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...
- 批处理禁止指定的IE的加载项
步骤: 1.查找插件对应的 CLSID 获取 HKCU\Software\Microsoft\Windows\CurrentVersion\Ext\Stats 下的 CLSID, 然后在 HKCR\C ...
- svn向服务器添加新建文件夹
tip: 1)提交文件分为两步,先将要提交的文件加入缓存区,然后将文件提交 2)add:添加的意思.commit:提交的意思 第一步:加入缓存区(如图) 1)选择要提交的文件 2)右键svn---&g ...
- error C3867: “std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str”: 函数调用缺少参数列表;请使用“&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str”创建指向成员的指针
这个问题找了很多没有找到满意的答案.仔细看了一下,是使用了c_str的问题. 我直接把使用string.c_str的地方使用char*代替即解决问题.