synchronized(){}同步代码块笔记(新手笔记,欢迎纠正)
/* 内容:同步代码块,目的是解决多线程中的安全问题。什么安全问题呢??就是在执行run方法时,假如线程-0刚刚获得执行权,
*还没执行时,就挂那了,这时线程-1获得执行权,并进行执行,就有可能出现负数票的情况。
*原因:当一个线程执行run方法时,线程1操作共享数据时,失去了cpu执行权,导致线程2执行run方法,从而导致共享数据错误。
* 解决办法:给多线程所要执行的代码加上锁。当一个线程执行run方法时,锁上锁,即使失去CPU执行权,
*从而使其他线程不能执行run方法;
* synchronized(对象_){同步代码}:同步代码块,其中包含多线程共同执行的代码,此代码被同步.
* 其中的对象就像一个锁.即使执行同步代码的线程失去CPU执行权,其他线程也会被锁在外面不能执行同步代码
* 疑惑:obj对象??/毕老师当时没讲,只说了可以是任意对象,他直接调用的object上帝类建立了对象;
* 例子:火车中的厕所
* 同步前提:1,必须有两个或者两个以上的线程
* 2,这些线程必须是使用的同一个锁.(原因举例:3,4节车厢的厕所,不是同一个锁,线程1,线程2可以同时进入3,4节车厢的厕所,不能达到同步的目的.
*好出:解决了多线程的安全问题
*弊端:每次都得判断锁,浪费了资源.
*/
package ThreadDemoOne;
class TicketDemo implements Runnable
{
int ticket=1000;
Object obj =new Object();
public void run()
{
while(true)
{
synchronized(obj)//obj就是一个锁,这里的synchronized就是同步代码块.括起来的就是线程需要一次性执行完的代码.
{ if(ticket>0)
{
System.out.println(Thread.currentThread()+"号售票员"+"这是第"+this .ticket+"张票");
ticket--;
}
} }
}
}
public class ThreadDemo6
{
public static void main(String[] args )
{
TicketDemo t=new TicketDemo();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start(); } }
/*运行结果摘取: Thread[Thread-1,5,main]号售票员这是第156张票
Thread[Thread-1,5,main]号售票员这是第155张票
Thread[Thread-1,5,main]号售票员这是第154张票
Thread[Thread-0,5,main]号售票员这是第153张票
Thread[Thread-0,5,main]号售票员这是第152张票 */
synchronized(){}同步代码块笔记(新手笔记,欢迎纠正)的更多相关文章
- 59、synchronized同步代码块
synchronized同步方法的问题 有些情况下,在方法上面加synchronized同步,会有性能问题.请看下面代码,来计算下两个线程执行的耗时: package com.sutaoyu.Thre ...
- 线程同步 synchronized 同步代码块 同步方法 同步锁
一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...
- java中的synchronized同步代码块和同步方法的区别
下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...
- 线程执行synchronized同步代码块时再次重入该锁过程中抛异常,是否会释放锁
一个线程执行synchronized同步代码时,再次重入该锁过程中,如果抛出异常,会释放锁吗? 如果锁的计数器为1,抛出异常,会直接释放锁: 那如果锁的计数器为2,抛出异常,会直接释放锁吗? 来简单测 ...
- synchronized同步代码块锁释放
今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637 问题线程的内容. &quo ...
- synchronized 同步代码块,售票问题
package cn.ljs.FristSync; public class SalerDemo extends Thread { static int tickets = 1000; String ...
- java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- java多线程(三)——锁机制synchronized(同步语句块)
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解 ...
随机推荐
- 使用Eclipse、Tomcat遇到的一些问题
Tomcat服务无法启动 前两天瞎搞,试着弄了弄Android的环境.结果不知道动了什么地方,Tomcat崩了,本地打开localhost:8080一直显示404,eclipse也无法使用Tomcat ...
- 步步为营-90-SEO(url重写+超链接技巧)
目的:便于搜索引擎抓取 url重写:将带参数的url如:https://i.cnblogs.com/EditPosts.aspx?opt=1.修改为https://i.cnblogs.com/Edit ...
- python—命名规范
文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...
- WMSYS.WM_CONCAT返回CLOB类型的解决办法
https://blog.csdn.net/cnm_csdn_wt/article/details/80047878
- OSGi HelloWorld
1.创建项目 2.Debug Configurations,配好之后,可以点一下右下角的Validate Bundles验证一下是否有问题 3.Debug
- context日志
class Program { static void Main(string[] args) { List<wolf_example> Listw; using (var ctx = n ...
- 【转】Android逆向入门流程
原文:https://www.jianshu.com/p/71fb7ccc05ff 0.写在前面 本文是笔者自学笔记,以破解某目标apk的方式进行学习,中间辅以原理性知识,方便面试需求. 参考文章的原 ...
- URL地址编码和解码
0. 参考 [整理]关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode) python3中的urlopen对于中文url是如何处理的? 中文URL的编码问题 ...
- python全栈开发day51-jquery插件、@media媒体查询、移动端单位、Bootstrap框架
一.昨日内容回顾 技术行业 (1)ajax技术 XMLHttpRequest() <1>创建XMLHttpRequest()对象 <2>检测状态(通过readyState的改变 ...
- Kudu Native RDD
Spark与Kudu的集成同事提供了kudu RDD import org.apache.kudu.spark.kudu.KuduContext import org.apache.spark.{Sp ...