atomic

{Django基础六之ORM中的锁和事务}一 锁 二 事务

我们两清 提交于 2020-05-05 13:32:20
{Django基础六之ORM中的锁和事务}一 锁 二 事务 Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁   行级锁     select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节。     返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SELECT ... FOR UPDATE 语句。     举个例子: entries = Entry.objects.select_for_update().filter(author=request.user) #加互斥锁,由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。create、update、delete操作时,mysql自动加行级互斥锁     所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。     一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞,直到锁被释放。 如果这不想要使查询阻塞的话,使用select_for_update(nowait=True)。 如果其它事务持有冲突的锁,互斥锁, 那么查询将引发 DatabaseError 异常。你也可以使用select_for_update(skip_locked=True

linux时间管理与配置date与hwclock命令

拜拜、爱过 提交于 2020-05-05 07:44:05
简介: 古代计时方式 ●在远古时期,人类用来确定时间的方式是一些自然界“相对”亘古不变的周期。如地球的公转是为一年,月球的公转是为一月,地球的自转是为一天等,最早的计时可以追溯到公元前大约2000年,古埃及人利用光线留下的影子用作计时的工具。影子拉得越长,计时越精确。古埃及人修建高耸入云的大型方尖碑,来追踪太阳的移动,随后人们又利用了沙漏、日晷、钟摆等工具,巧妙地利用一些相对固定而准确的周期来计时 ●商朝人开发并使用了一种泄水型水钟——漏壶。后来又有用蜡烛和线香计时的 ●北宋元祐元年(1086年),天文学家苏颂将浑仪、浑象和报时装置结合,建造一个划时代的计时工具——“水运仪象台” ●14世纪时,西方国家广泛使用机械钟。在十六世纪,奥斯曼帝国的科学家达兹·艾-丁(Taqi al-Din)发明出了机械闹钟 ●1583年,伽利略提出了著名的等时性理论,即不论摆动幅度的大小,完成一次摆动的时间是相同的。1656年,荷兰科学家克里斯蒂安·惠更斯(Christiaan Huygens)应用他的理论,设计出了世界第一只钟摆 ●1868年,百达翡丽(Patek Philippe)发明了手表 现代计时方式 ●石英晶体受到电池的电力影响时,会产生规律的振动。每秒的振动次数是32768次,可以设计电路来计算振动次数,当计数到32768次时,即计时1秒。1967年,瑞士人发布了世界上首款石英表

django中使用mysql数据库的事务

試著忘記壹切 提交于 2020-05-05 01:04:28
django中怎么使用mysql数据库的事务 Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败 。 Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交。我们需要在保存数据库操作中自己控制数据库事务的执行流程。 在Django中可以通过 django.db.transaction 模块提供的 atomic 来定义一个事务, atomic 提供两种用法: 装饰器用法    from django.db import transaction @transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行 ...    with语句用法   from django.db import transaction def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 ... with transaction.atomic(): # 这部分代码会在事务中执行 ...    在Django中,还提供了保存点的支持,可以在事务中创建保存点来记录数据的特定状态,数据库出现错误时,可以恢复到数据保存点的状态 from django.db import transaction #

CSAPP Chapter 8:Exception Control Flow

为君一笑 提交于 2020-05-04 17:59:19
  prcesssor在运行时,假设program counter的值为a 0 , a 1 , ... , a n-1 ,每个ak表示相对应的instruction的地址。从a k 到a k+1 的变化被称为control transfer。一系列的control transfers被称为control flow。   exceptions是指一些event,这些event表明当前的system、processor或executing program存在某些状况(详见1.2)。exceptions会导致control flow的突变,典型的就是将控制从当前运行的程序或任务转移到exception handler的执行(详见1.1节)。在计算机程序中,我们设计了jump和branch,call和return;他们通过program state的变化,引起了control flow的突变。exceptions中的control flow的突变是通过system state的变化来引发的,这种control flow的突变被称为exception control flow。interrupt作为exceptions的一种,当由I/O devices complete引发interrupt后,I/O devices通过pin的变化给processor发送signal,并将exception

裸指针与智能指针的线程安全问题

假如想象 提交于 2020-05-03 16:28:39
文章目录 裸指针线程安全问题 使用普通裸指针造成的问题 shared_ptr 和 weak_ptr的解决问题 shared_ptr的线程安全问题 智能指针shared_ptr本身(底层实现原理是引用计数)是线程安全的 智能指针指向的对象的线程安全问题,智能指针没有做任何保障 多线程编程中的三个核心概念 总结 解决办法-加入锁机制 裸指针线程安全问题 使用普通裸指针造成的问题 #include <iostream> #include <memory> #include <thread> using namespace std; class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void funA() { cout << "A的一个非常好用的一个方法" << endl; } }; void hander01(A *p) { std::this_thread::sleep_for(std::chrono::seconds(2)); p->funA(); } int main() { A *p = new A(); thread t1(hander01,p); delete p; t1.join(); } 运行结果: A() ~A() A的一个非常好用的一个方法

Linux内存管理 (19)总结内存管理数据结构和API

与世无争的帅哥 提交于 2020-05-02 05:09:54
专题: Linux内存管理专题 关键词:mm、vaddr、VMA、page、pfn、pte、paddr、pg_data、zone、mem_map[]。 1. 内存管理数据结构的关系图 在大部分Linux系统中,内存设备的初始化一般是在BIOS或bootloader中,然后把DDR的大小传递给Linux内核。因此从Linux内核角度来看DDR,其实就是一段物理内存空间。 1.1 由mm数据结构和虚拟地址vaddr找到对应的VMA extern struct vm_area_struct * find_vma( struct mm_struct * mm, unsigned long addr); extern struct vm_area_struct * find_vma_prev( struct mm_struct * mm, unsigned long addr, struct vm_area_struct ** pprev); static inline struct vm_area_struct * find_vma_intersection( struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr) { struct vm_area_struct * vma = find_vma(mm

【Java并发】Java中的原子操作类

时光毁灭记忆、已成空白 提交于 2020-04-29 23:40:07
综述 JDK从1.5开始提供了java.util.concurrent.atomic包。 通过包中的原子操作类能够线程安全地更新一个变量。 包含4种类型的原子更新方式:基本类型、数组、引用、对象中字段更新。 atomic包中的原子操作类基本上内部都是使用Unsafe类实现的,原子更新的实质其实就是获取内存偏移地址,对地址中的变量进行更新 。 关于Unsafe类,可以参考我的这篇博文 【Java并发】Java中的Unsafe类 1.原子更新基本类型类 atomic包内包含AtomicBoolean、AtomicInteger、AtomicLong这3个类,以下以AtomicInteger进行讲解。 AtomicInteger是如何实现原子操作的? 是使用Unsafe类实现的,而Unsafe实现原子操作的原理是通过得到变量相对于对象示例的内存偏移地址,更新内存地址内的变量值。 下面是摘录的AtomicInteger的部分源码。 /** * Atomically increments by one the current value. * * @return the previous value */ public final int getAndIncrement() { return unsafe.getAndAddInt( this , valueOffset, 1 ); } /*

Java同步方法:synchronized到底锁住了谁?

梦想与她 提交于 2020-04-29 15:52:51
目录 前言 同步方法 类的成员方法 类的静态方法 同步代码块 总结 其他同步方法 参考资料 前言 相信不少同学在上完Java课后,对于线程同步部分的实战,都会感到不知其然。 比如上课做实验的时候,按着老师的实验指导书中的描述完成了多线程的同步操作,就感觉自己已经掌握这个知识点了,实际运用中再次手足无措,就像我一样。 这里提问一下:synchronized对方法修饰,在别处调用这个方法时,谁被锁定了呢?另外,在新建线程中使用synchronized(this){ }结构时,如: void methodA() { new Thread(() -> { synchronized (this) { this.methodB(); } }).start(); } 这个被锁的this又是谁呢? 这篇博文来详细介绍一下线程同步中涉及synchronized修饰的两种用法:同步方法和同步代码块。 才不会说这篇是我对一个项目代码中的线程同步机制感到迷惑而搜资料写的笔记( 同步方法 先开始介绍synchronized修饰符本身的特性: synchronized关键字 不能 被继承 即父类方法是同步方法 子类方法继承后默认不是同步方法 synchronized 不能 修饰接口方法 因为接口是特殊的抽象类 不能新建实例 实例锁应归实现其的类所有 synchronized 不能 修饰构造方法

Linux虚拟地址空间布局以及进程栈和线程栈总结

淺唱寂寞╮ 提交于 2020-04-29 03:16:27
转自: https://blog.csdn.net/freeelinux/article/details/53782986 本文转自多个博客,以及最后有我的总结。我没有单独从头到尾写一个总结的原因是别人已经写得很好了,我不花大量时间是无法达到这水平的。 一:Linux虚拟地址空间布局 (转自: Linux虚拟地址空间布局 ) 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内核使用那么多物理内存,仅表示它可支配这部分地址空间,根据需要将其映射到物理内存。 虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页时会导致一个页错误(page fault)。在Linux中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化。

2020最新Java工程师面试题-Java 并发编程(一)(附答案,持续更新中)

纵然是瞬间 提交于 2020-04-28 16:18:47
1、在 java 中守护线程和本地线程区别? java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。 任何线程都可以设置为守护线程和用户线程,通过方法 Thread.setDaemon(bool on);true 则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon() 必须在 Thread.start()之前调用,否则运行时会抛出异常。 两者的区别 : 唯一的区别是判断虚拟机(JVM)何时离开,Daemon 是为其他线程提供服务,如果 全部的 User Thread 已经撤离,Daemon 没有可服务的线程,JVM 撤离。也可 以理解为守护线程是 JVM 自动创建的线程(但不一定),用户线程是程序创建的 线程;比如 JVM 的垃圾回收线程是一个守护线程,当所有线程已经撤离,不再产 生垃圾,守护线程自然就没事可干了,当垃圾回收线程是 Java 虚拟机上仅剩的线 程时,Java 虚拟机会自动离开。 扩展 :Thread Dump 打印出来的线程信息,含有 daemon 字样的线程即为守护 进程,可能会有:服务守护进程、编译守护进程、windows 下的监听 Ctrl+break 的守护进程、Finalizer 守护进程、引用处理守护进程、GC 守护进程。 2、线程与进程的区别? 进程是操作系统分配资源的最小单元