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. qt creator 常量中有换行符(转)

    这篇文章写于QT5.6的诞生,它是QT5的第一个长期支持版.这也是QT5已成熟的里程碑. 我搭建的环境是:Win10+VS2015+QT5.6+QtCreator 在安装VS2015的时候,若是用Qt ...

  2. 软件工程实践总结&个人技术博客

    这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求 这个作业的目标 总结课程与学到的技术回顾课程 其他参考文献 <构建之法><软件质量和测试> 目录 课程回顾与总结 ...

  3. VMware导入ovf报错

    如下图所示报错 在网上查找了一些解决方案,大都说是ovftool版本兼容问题,但是我这里好像并不行,最后的解决的办法是对导入的位置默认不做改动. 报错原因:改变了默认路径.

  4. 直播软件源码,uniapp滚动条置顶实现

    直播软件源码,uniapp滚动条置顶实现 实现功能: uniapp置顶滚动条.自定义页面滚动条的位置 实现代码: uni.pageScrollTo({    scrollTop: 0,    dura ...

  5. gRPC 入门(一)

    前言 在学习 gRPC 之前,先学习 protobufu 协议,简单的来理解,我们可以使用他来定义 消息 和 服务.然后你只需要实现服务即可,剩下的东西,gRPC 会帮你自动完成. protobufu ...

  6. Hyperf微服务

    https://hyperf.wiki 状态码含义 https://segmentfault.com/a/1190000002523655

  7. Windows系统的显示器校正

    莫名其妙的显示器显示的内容整体向上偏移,导致一些页面在最大化窗口时,看不见页面的标题,及操作按钮,如页面的关闭,缩小按钮. 解决方法:点击显示器下方的menu按钮,找到 设定 选项,再选择 复位 即可 ...

  8. 常见的abd命令

    https://blog.csdn.net/qq_34512207/article/details/125283285

  9. SpannableString 设置文字中的颜色 链接

    SpannableString spannableString = new SpannableString(matchResult); int index = matchResult.indexOf( ...

  10. http头部meta 作用

    <meta charset="utf-8"> <!-- 设置文档字符编码 --> <meta http-equiv="x-ua-compat ...