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. 思科数据中心CCIE v3.0考试内容

    考试内容: CCIE DC LAB V3.0 考试内容 1 Design 30 + 选择,拖图及勾选题 2 Deploy&Operate&Optimize 1 套 含3部分 备考安排: ...

  2. Cygwin64静默安装办法

    下载地址: http://www.cygwin.com/setup-x86_64.exe 静默安装办法: .\setup-x86_64.exe --no-shortcuts --root D:\\Cy ...

  3. 剑指 Offer 链表

    06. 从尾到头打印链表 class Solution { public: //两个指针一起走 一次翻转一个方向 最后head.next =null ListNode* reverse1(ListNo ...

  4. 【PS】PS如何扩展画布?

    [PS]PS如何扩展画布? 选择裁剪,拉伸图片 选择上方工具栏的勾 即可扩展图片

  5. AXI 协议翻译介绍

    一.介绍 Introduction 本章描述了axis协议的体系结构和协议定义的基本事务.它包含以下部分:•第1-2页关于AXI协议•第1-3页是架构•第1-7页是基本事务•第1-11页的附加功能. ...

  6. Ubuntu中恢复rm命令误删文件(超级详细+亲测有效)

    Ubuntu中恢复rm命令误删文件(超级详细+亲测有效) 置顶 2019年05月27日 11:13:12 rain_Man2018 阅读数 40   在实验室做项目时使用的是ubuntu16.04 某 ...

  7. CC2530

    代码操作外设的一般步骤:• 1. 将代码编译成CPU能识别的语言• 2. cpu解析执行代码流• 3. 然后通过总线找到外设连接的控制器的寄存器(即SFR),通过设置这些寄存器,来指挥控制器工作.

  8. 如何在winform打包时带上sqlite数据库

    sqlite数据库下载及使用:https://blog.csdn.net/Yyuanyuxin/article/details/105508886sqlite数据库可视化工具-- DB.Browser ...

  9. django修改认证模型类

    1.我在一个子应用下面创建了一个apps目录,且在apps下又创建了一个子应用users,结构如下图: 2.在users的models.py中 from django.db import models ...

  10. Twig

    {{ dump() }}{{ dump(variable_name) }}List available variables (at top level): {{ dump(_context|keys) ...