package com.lei.syn;

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());
}
} package com.lei.syn; public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket buyTicket=new BuyTicket(); new Thread(buyTicket,"A").start();
new Thread(buyTicket,"B").start();
new Thread(buyTicket,"C").start();
}
} class BuyTicket implements Runnable{ //票
private int ticketNums=10;
boolean flag=true;
@Override
public void run() {
//买票
while (flag){
try {
Buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} //synchronized同步方法
private synchronized void Buy() throws InterruptedException {
if(ticketNums<=0){
flag=false;
return;
}
//模拟延时
Thread.sleep(1000); //买票
System.out.println(Thread.currentThread().getName()+"拿到第"+ticketNums--+"张票");
}
} package com.lei.syn; public class UnsafeFeBand {
public static void main(String[] args) {
Account account = new Account(1000, "结婚基金"); Drawing you = new Drawing(account,50,"你");
Drawing girlfriend = new Drawing(account, 100, "女朋友"); 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; String name; public Drawing(Account account, int drawingMoney, String name){
this.account=account;
this.drawingMoney=drawingMoney;
this.name=name;
} //取钱
@Override
public void run() {
synchronized (account){
//判断有没有钱
if(account.money-drawingMoney<0){
System.out.println(name + "钱不够,取不了");
return;
} 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()因为继承了Thread
System.out.println(name+"手里的钱"+nowMoney);
}
}
}

synchronized同步的更多相关文章

  1. Java多线程synchronized同步

    非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程 ...

  2. synchronized同步块和volatile同步变量

    Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而 ...

  3. java多线程(三)——锁机制synchronized(同步语句块)

    用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解 ...

  4. 使用synchronized同步,经典银行账户问题

    1.新建Account类,使用synchronized同步增加和减少金额方法. package com.xkzhangsan.synchronizedpack.bank; public class A ...

  5. java中的synchronized同步代码块和同步方法的区别

    下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...

  6. 转:JAVA 的wait(), notify()与synchronized同步机制

    原文地址:http://blog.csdn.net/zyplus/article/details/6672775 转自:https://www.cnblogs.com/x_wukong/p/40097 ...

  7. java synchronized 同步详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  8. 线程执行synchronized同步代码块时再次重入该锁过程中抛异常,是否会释放锁

    一个线程执行synchronized同步代码时,再次重入该锁过程中,如果抛出异常,会释放锁吗? 如果锁的计数器为1,抛出异常,会直接释放锁: 那如果锁的计数器为2,抛出异常,会直接释放锁吗? 来简单测 ...

  9. synchronized同步代码块锁释放

    今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637  问题线程的内容. &quo ...

  10. 59、synchronized同步代码块

    synchronized同步方法的问题 有些情况下,在方法上面加synchronized同步,会有性能问题.请看下面代码,来计算下两个线程执行的耗时: package com.sutaoyu.Thre ...

随机推荐

  1. 当win7遭遇蓝屏代码0x0000006b

    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/15069877.html 关键词:win7.蓝屏.0x0000006b 事发 话说在某个周末,当我打开电脑, ...

  2. 导出SQL SERVER 数据字典语句

    --use YourDatabase --指定要生成数据字典的数据库go SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=c ...

  3. Python的入门学习Day 10~13——form”夜曲编程“

    Day 10 time:2021.8.7. ​ 今天本来打算学习时发现手机应该拿去充电了,再上完J课程之后发现时间确实只留到了晚上呢 .但幸好,以我多天的敲代码的牢固根基(哈哈哈),我最终还是弥补回来 ...

  4. 前端之Vue day08 Vue3项目搭建、setup、toRefs

    一.Vue3 介绍 # 新项目使用vue3,有部分老项目使用vue2 # vue3 的变化 1.性能的提升 -打包大小减少41% -初次渲染快55%, 更新渲染快133% -内存减少54% 2.源码的 ...

  5. vite实现element-plus按需配置,自定义主题和读取/修改系统主题色

    项目地址 vite.config.ts 插件和vite配置 import { defineConfig } from "vite"; import vue from "@ ...

  6. jwt二次加密失败原因(Bad “options.expiresIn“ option the payload already has an “exp“ property.)

    在写vue+nodejs项目的校验token时,出现了次错误 然后想了想问题所在: 第一次加密的时候使用jwt.sign(value,秘钥,{}),会返回一个字符串,然后当前端跳转别的发送请求时,会将 ...

  7. 在 Vue 项目中使用 MQTT

    Vue 是一款由尤雨溪及其团队开发的渐进式 Javascript 前端框架.该框架具备数据双向绑定.组件化.响应式和轻量等特点,搭配其脚手架 Vue CLI 使得开发者更加容易上手,大大减少了学习成本 ...

  8. unable to access 'https://github.com/.../...git': Recv failure: Connection was reset

    解决git下载报错:fatal: unable to access 'https://github.com/.../...git': Recv failure: Connection was rese ...

  9. 给自己提个醒,渲染模版引擎handlebars已经足够好用了,不要再到处乱看浪费时间了。

    <html><body onload="renderHello()"><div id="target">Loading... ...

  10. Cadence Allegro创建盲埋孔

    1.首先创建两个常规过孔,文件名分别为Via10d4.Via16d8. 2.打开PCB Editor,然后选择菜单Setup -> B/B ViaDefinitions -> Define ...