同步方法及同步代码块

synchronized方法和synchronized块

synchronized方法必须获得对象的锁才能执行,否则线程阻塞,方法一旦执行,就独占此锁,直到方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行

synchronized会影响效率

同步块synchronized(Obj){},Obj是同步监听器,第一个线程访问,所定Obj,完后解锁Obj,第二个才能访问

同步方法弊端:方法里面需要修改的内容才需要锁,锁的太多,浪费资源

package com.wuming.syn.synch;
//不安全的买票
public class UnSafeBuyTicket {public static void main(String[] args) {BuyTicket station = new BuyTicket();new Thread(station,"苦逼的我").start();new Thread(station,"牛逼的你们").start();new Thread(station,"可恶的黄牛党").start();}
}class BuyTicket implements Runnable{//票private int ticketNums=10;boolean flag=true;//停止方式/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the object's* <code>run</code> method to be called in that separately executing* thread.* <p>* The general contract of the method <code>run</code> is that it may* take any action whatsoever.** @see Thread#run()*/@Overridepublic void run() {//买票while(flag){try {buy();} catch (InterruptedException e) {e.printStackTrace();}}}//synchronized同步方法,锁的是this BuyTicketprivate synchronized void buy() throws InterruptedException {//判断是否有票if (ticketNums<=0){flag=false;return;}//模拟延时Thread.sleep(100);//买票System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);//加了synchronized,安全/*    苦逼的我拿到10可恶的黄牛党拿到9可恶的黄牛党拿到8牛逼的你们拿到7可恶的黄牛党拿到6苦逼的我拿到5苦逼的我拿到4可恶的黄牛党拿到3牛逼的你们拿到2可恶的黄牛党拿到1*/}
}

===============

package com.wuming.syn;
//不安全的取钱
//两个人去银行取钱,账户
public class UnSafeBank {public static void main(String[] args) {//账户Account account = new Account(100,"结婚基金");Drawing you = new Drawing(account,50,"你");Drawing girlFriend = new Drawing(account,100,"girlFriend");you.start();girlFriend.start();}}
//账户
class Account{int money;//余额String name;//卡名public Account(int money, String name) {this.money = money;this.name = name;}
}//银行,模拟取款
class Drawing extends Thread{Account account;//账户//取了多少钱int drawingMoney;//现在手里有多少钱int nowMoney;public Drawing(Account account, int drawingMoney, String name) {super(name);//线程namethis.account = account;this.drawingMoney = drawingMoney;this.nowMoney = nowMoney;}
//取钱//synchronized默认锁的是本身@Overridepublic void run() {//锁的对象是变化的量,增删改;改成this就是指银行,线程不安全如下/*     结婚基金余额为:-50结婚基金余额为:-50你手里的钱50girlFriend手里的钱100*/synchronized (account){//判断有没有钱if(account.money-drawingMoney<0){System.out.println(Thread.currentThread().getName()+"钱不够,取不了");return;}//sleep可以放大问题的发生性try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//卡内余额=余额-你取的钱account.money=account.money-drawingMoney;//你手里的钱nowMoney=nowMoney+drawingMoney;System.out.println(account.name+"余额为:"+account.money);//Thread.currentThread().getName()=this.getName();System.out.println(this.getName()+"手里的钱"+nowMoney);}//使用同步块 synchronized (account),线程安全/*    结婚基金余额为:50你手里的钱50girlFriend钱不够,取不了*/}
}

===============

package com.wuming.syn.synch;import java.util.ArrayList;
import java.util.List;//线程不安全的集合
public class UnsafeList {public static void main(String[] args) {List<String> list=new ArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(()->{synchronized (list){//线程安全list.add(Thread.currentThread().getName());}}).start();}try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(list.size());//每次运行都不够10000,线程不安全,两个线程同时操作同一个位置,//两个数组添加到同一个位置,就会覆盖掉,元素就会少}
}

10000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“史上最强春节档”来袭!数据解读值得看的影片是......

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者介绍&#xff1a;徐麟&#xff0c;目前就职于互联网公司数据部&#xff0c;哥大统计数据狗&#xff0c;从事数据挖掘&分析工作&#xff0c;喜欢用R&Python玩一些不一样的数据个人公众号&#xff1a;数据森麟&#xff08…

C语言 sizeof 函数 - C语言零基础入门教程

目录 一.sizeof 函数简介二.sizeof 函数实战三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.sizeof 函数简介 在 C 语言中&#xff0c;char 字符串也是一种非常重要的数据类型&#xff0c;我们除了使用 strlen 函数获取字符串长度之外&…

多线程:CopyOnWriteArrayList

package com.wuming.syn;import java.util.concurrent.CopyOnWriteArrayList;//测试JUC安全类型的集合 public class TestCallable {public static void main(String[] args) {CopyOnWriteArrayList<String> list new CopyOnWriteArrayList<String>();for (int i …

大厂必问的分布式究竟是什么鬼?

戳蓝字“CSDN云计算”关注我们哦&#xff01;新的一年又开始了&#xff0c;各大招聘咨询机构都会对过去一年市场上的人才供需进行盘点。根据高端招聘平台100 offer发布的Java人才盘点报告&#xff0c;在过去的2018年&#xff0c;Java仍然是最流行、招聘供需量最大的技术语言。在…

死锁详细讲解

多个线程占有自己资源还想占用其他线程的资源导致两个或以上线程停止运行的情况 某一个同步块同时拥有“两个以上对象的锁”时可能发生死锁 死锁四个必要条件&#xff1a; 一&#xff1a; a资源只能被一个进程使用 二&#xff1a; 一个进程阻塞时拥有的a资源不释放 三&…

C语言 strcpy 函数 - C语言零基础入门教程

目录 一.strcpy 函数简介二.strcpy 函数实战 1.strcpy 函数简单使用2.strcpy 函数拷贝内容以’\0’结尾3.strcpy 函数注意崩溃问题 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcpy 函数简介 C 语言在 string.h 中strcpy函数,可用完成…

为什么不用原生Spring-Cloud-Config

戳蓝字“CSDN云计算”关注我们哦&#xff01;引言近几年传统应用架构已经逐渐朝着微服务架构演进。那么随着业务的发展&#xff0c;微服务越来越庞大&#xff0c;此时服务配置的管理变得会复杂起来。为了方便服务配置文件统一管理&#xff0c;实时更新&#xff0c;配置中心应运…

cesium实现区域贴图及加载多个gif动图

1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图&#xff0c;如果能够将gif动图进行解析&#xff0c;获得时间序列对应的每帧图片&#xff0c;然后按照时间序列动态更新Billboard的纹理&#xff0c;即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…

C语言 strcpy_s 函数 - C语言零基础入门教程

目录 一.strcpy 函数简介二.strcpy 函数实战 1.strcpy 函数简单使用2.strcpy 函数拷贝内容以’\0’结尾3.strcpy 函数注意崩溃问题 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcpy 函数简介 C 语言在 string.h 中strcpy函数,可用完成…

Lock锁详细讲解

package com.wuming.thread;import java.util.concurrent.locks.ReentrantLock;//测试Lock锁 public class TestLock {public static void main(String[] args) {TestLock2 testLock2 new TestLock2();//多个对象操作同一个资源票&#xff0c;不用lock时线程不安全/* 1089765…

DevOps“兵器”60样,你都会使哪几样?

戳蓝字“CSDN云计算”关注我们哦&#xff01;编前按&#xff1a;获得开发者社区支持的自动化&#xff0c;开源的工具是大家梦寐以求的。这里列举了 60 多款最棒的开源工具&#xff0c;可以帮助你很好的实行 DevOps。一、开发工具版本控制&协作开发1.版本控制系统 GitGit是一…

synchronized和lock

区别&#xff1a; lock手动开启和关闭锁&#xff0c;synchronized出了作用域自动释放 lock只要代码块锁&#xff0c;synchronized有方法锁和代码块锁 lock锁jvm花费较少的时间调度线程&#xff0c;性能更好&#xff0c;更好的扩展性&#xff08;提供更多的子类&#xff09; …

C语言 memcpy 函数 - C语言零基础入门教程

目录 一.memcpy 函数简介二.memcpy 函数实战 1.memcpy 函数简单使用2.strcpy 函数属于字符串拷贝3.memcpy 函数属于内存拷贝4.memcpy 函数注意崩溃问题 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.memcpy 函数简介 C 语言在 string.h 中…

云漫圈 | 腾讯面试,我竟然输给了final关键字

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;乔戈里来源&#xff1a;程序员乔戈里腾讯面试现场——————final 在 Java 中是一个保留的关键字&#xff0c;可以声明变量、方法、类。什么是final变量 / 类 / 方法&#xff1f;任何变量前被 final 修饰就是 fin…

C语言 memcpy_s 函数 - C语言零基础入门教程

目录 一.memcpy_s 函数简介 1.memcpy 函数报错&#xff1a;error C49962.memcpy 函数没有方法来保证有效的缓冲区尺寸&#xff0c;使用不安全 二.memcpy_s 函数语法三.memcpy_s 函数实战四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.memcp…

多线程:生产者消费者问题

1.假设仓库只能存一件产品&#xff0c;生产者将产品放入仓库&#xff0c;消费者将产品从仓库取出 2.仓库没有产品&#xff0c;生产者将产品放仓库&#xff0c;否则停止生产并等待&#xff0c;直到仓库产品被消费者取走 3.如果仓库放有产品&#xff0c;消费者可取走&#xff0…

学习微服务网关zuul,看这篇就够了

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;爱撒谎的男孩 原文&#xff1a;https://chenjiabing666.github.io/2018/12/25/zuul%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3/本文系读者投稿&#xff0c;已获作者原创授权。如果你有好文章&#xff0c;可以戳这里投稿…

C语言 strcat 函数 - C语言零基础入门教程

目录 一.strcat 函数简介二.strcat 函数原理三.strcat 函数实战四.注意 strcat 函数崩溃问题五.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcat 函数简介 前面文章中介绍了关于字符串拷贝的相关函数&#xff0c;例如&#xff1a;strcpy…

多线程:管cheng法

package com.wuming.thread;//测试&#xff1a;生产者消费者模型&#xff0c;利用缓冲区解决&#xff1a;管程法 //生产者&#xff0c;消费者&#xff0c;产品&#xff0c;缓冲区 public class TestPC {public static void main(String[] args) {SynContainer container new S…

C语言 strcat_s 函数 - C语言零基础入门教程

目录 一.strcat_s 函数简介二.strcat_s 函数原理三.strcat_s 函数实战四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcat_s 函数简介 前面文章中介绍了关于字符串拼接函数 strcat &#xff0c;而 strcat_s 函数和 strcat 函数一样&…