发布时间:2024-03-22 10:14:31作者:鹰视狼顾来源:网友上传

婴儿开锁子、系锁子的传说
婴儿开锁子、系锁子在鲁西、豫东以及黄河以北的大片区域流行很广,特别是在莘县南部乡镇非常流行。据《观城县志》和《张氏家谱》记载,系、开索(锁)的最早记录可追溯到明朝初期,大批移民自山西洪洞迁至黄河中下游后。其实开锁子、系锁子在当时还有一段传说故事。
“开锁子”是当地的一个民间风俗。孩子一出生时会请人算算生辰八字,如果孩子属相和父母一方不合或者孩子五行不足,就需要找个干爸干妈或者过继爹过继娘,只为了孩子好养活。到孩子长到12虚岁时到干爸干妈家开锁子,孩子便会无病无灾了。相传为孩子认一干娘,干娘可以是灶王奶奶、石磙,也可以是邻居大娘、婶子,在孩子满月的时候,为干娘烧香、上供或送礼物,并给婴儿系上一铜钱,必须用红头绳。此后,每年生日的时候,逐年增加铜钱,一年一枚,叫“系索子”。直到年满12岁时,生日那天,脖颈上再加把锁,把12枚铜钱锁住,举行开锁仪式,也叫成人仪式。届时,亲戚邻居都被邀来,各自带来自家饭,让孩子和另一同龄孩子躲进八仙桌下,亲朋好友们便手挽饭篮,逐一围桌子转,口中并念念有辞“走一程又一程,累得我小脚疼”“走一圈又一圈,累得我小脚歪”,然后把篮子放进桌子底下,让两个同龄小孩每人咬一口饭,被称为“吃百家饭”“吃百家馍”,由干娘亲手开启锁在胸前的锁,并将12枚铜钱一一散尽,这就意味着从今天起,孩子就成人了,从此告别幼儿时代。
婴儿系锁子、开锁子的民俗,情节感人,表现形式丰富多彩,反映了当地淳朴善良、和谐的民风,在莘县民间通过代代口传等方式传承下来,是民间习俗的重要组成部分,有其厚重的文化价值和历史价值,是一笔珍贵的非物质文化遗产。
来源:莘县史志整理
之前有提到过一把锁保护多个资源,如果是多个资源间存在关联关系,如账户A给账户B转账,一把锁怎么锁住同一个资源呢?当时只是采用简单的方法,锁住整个类模板Account.class方法解决,如下代码。
public class Account { private Integer balance; // 新增代码结束 public void transfer( Account target, int amt){ // 获取锁 使用类模板 synchronized (Account.class){ if (this.balance > amt) { this.balance -= amt; target.balance += amt; } } } }
这时候并发安全性问题解决了,但是因为锁的是账户类Account.class模板类,相当于锁住了所有的账户,能不能想着将锁细粒度化呢?当然是可以的,如下代码
public class Account { private Integer balance; public void transfer( Account target, int amt){ // 获取锁 synchronized (this){ synchronized (target){ if (this.balance > amt) { this.balance -= amt; target.balance += amt; } } } } }
这时候将锁细粒度化为锁住this对象和target对象,不再锁住Account,class类模板,当然效率将会大幅度提升,不过需要注意万事有利有弊,这时引进一个新问题,结合实际生活问题说明。
生活场景假如生活中的银行转账全部只能线下完成,每个账户就是一个账本,当账户A转账给账户B时银行柜台工作人员大概有如下三种情况:
账户A账本不在柜台,那么银行柜台人员等待账本A归还。账本A存在柜台中,柜台人员去获取账本B时账本B不在柜台中,柜台人员等待账本B归还。账本A、B都存在柜台中,柜员都可以获取到。这时存在两个线程T1,T2去完成转账操作,T1需要将账户A的100元转账给账户B,T2需要将账户B的150元转账给账户A,T1获取到了账户A的账本,即将去获取账户B的账本时,T2获取到账户B的账本,同时想去获取账户A的账本,如下图所示。
这时候T1,T2都陷入等待状态,都想获取对方手里的账本,这就是常说的”死等“,这里也就是编程时间常说的死锁。
死锁定义什么是死锁呢?
故多个互相竞争资源的线程相互等待,导致永久阻塞的现象。
需要注意的是,死锁一旦产生没有很好的解决办法,只能重启应用来解决,所以解决死锁最好的办法就是避免死锁。
如何避免死锁要想学会避免死锁,就需要弄清楚死锁发生的必要条件,死锁发生就必须同时满足如下四个条件。
互斥,同一时刻只能有一个线程访问。持有且等待,当线程持有资源A时,再去竞争资源B并不会释放资源A。不可抢占,线程T1占有资源A,其他线程不能强制抢占。循环等待,线程T1占有资源A,再去抢占资源B如果没有抢占到会一直等待下去。想要破坏死锁那么上诉条件只要不满足一个即可,那么分析如下
互斥条件,不可破坏,如果破坏那么并发安全就不存在了。持有且等待,可以破坏,可以一次性申请所有的资源。不可抢占,当线程T1持有资源A再次获取资源B时,发现资源B被占用那么主动释放资源A。循环等待,可以将资源排序,可以按照排序顺序的资源申请,这样就不会存在环形资源申请了。破坏持有且等待想要一次性申请所有的资源,那么所有的资源管理由管理员Allocator负责,当然Allocator必须是单例的,这样才能保证所有的容器als是同一个。
package com.example.demo.lock; import java.util.ArrayList; import java.util.List; public class Account { private Allocator allocator = Allocator.getAllocator(); private Integer balance; public void transfer( Account target, int amt){ // 申请资源,轮询等待 while (!allocatorly(this,target)); try { synchronized (this){ synchronized (target){ if (this.balance >= amt){ this.balance-=amt; target.balance+=amt; } } } }finally { // 释放资源 allocator.free(this,target); } } } // 管理员类 class Allocator{ private static Allocator allocator = null; private Allocator(){ } // 资源容器 private List<Object> als = new ArrayList<>(); // 申请资源 public synchronized Boolean apply(Object from,Object to){ // 只要包含一个账户申请失败 if (alsntains(from) || alsntains(to)){ return false; }else { als.add(from); als.add(to); } return true; } // 释放资源 public synchronized void free(Object from,Object to){ als.remove(from); als.remove(to); } // 简单单例 public static Allocator getAllocator(){ if (allocator == null){ synchronized (Allocator.class){ if (allocator == null){ allocator = new Allocator(); } } } return allocator; } }破坏不可抢占
想要破坏不可抢占那么需要线程主动释放资源,但是对于管程原语synchronized来讲并没有这个功能,如果抢占不到资源synchronized只会进入阻塞状态,这时候可以采用JUC中的Lock类中的tryLock(long, TimeUnit) 方法,就可以完美解决。
破坏循环等待破坏循环等待相对简单就是给资源排序,所有的线程按照资源顺序获取资源,这样不会形成环状请求,避免死锁,代码示例如下。
package com.example.demo.lock; // 破坏循环等待 public class AccountTest { private int id; private int balance; // 转账业务 public void transfer(AccountTest target,int amt){ AccountTest left = target; AccountTest right = this; if (this.id > target.id){ left = this; right = target; } // 先加锁id大的 synchronized (left){ synchronized (right){ this.balance-=amt; target.balance+=amt; } } } }
破坏死锁的方法有很多,对于目前的场景而言当然是破坏循环等待条件来得最为快捷和方便,在开发过程中需要衡量各个方法间的合理性。
开锁
在古怀庆府民间,多少年来还沿袭着一种习俗,就是在孩子十二周岁生日时家长要给孩子举行开锁仪式。
开锁习俗就是长命锁文化的一种延伸。按旧习,孩子出生满月后,姥姥或奶奶都要给孩子戴长命锁。俗信认为,小孩子出生以后在未成年期间魂魄不全,会有病有灾,需要用长命锁锁命。长命锁又名百家锁,是祝福孩子健康成长、压惊避邪、驱灾祛病、祈祷福寿的一种吉祥物,也是佑护孩子无病无灾、平安长大的护身符。长命锁更多表达的是长辈对晚辈的祝福和呵护,这是家长们所共有的一种朴素的思想意识。
古人为什么选定孩子在十二周岁时开锁呢?因为民间以十二属相计算年龄,每逢个人属相之年称“本命年”,十二岁是人生的第一个本命年。十二岁时开锁,意即从即日起孩子将从童年的蒙昧中解脱出来,步入少年时代。
开锁仪式一般在中午的特定时辰举行,开锁时辰是请算命先生根据孩子的生辰八字掐算出来的。时辰一到,先要祭祀天地全神及三代宗亲,祈求各路神灵及各位先人,保佑孩子无病无灾,健康成长。然后由孩子的母亲或奶奶用钥匙开锁。小铁锁预先用蓝线绳拴着,挂在孩子脖子上。打开小锁,象征着孩子即日起将从童年的蒙昧中解脱出来,步入全新的少年时代。开锁同时,母亲或奶奶还要说一些吉祥的祝福语,祈祷孩子将来能平平安安,学业有成,耀祖光宗,百事顺遂。
开锁仪式结束,全家聚餐,共同庆贺。
给孩子举行开锁仪式,在古怀庆府广大农村,此俗至今仍沿。
镜框字画如何挂在墙上(挂画镜框风水)
外向的八字(八字外向)
八字底的字(八字低)
八字月气是什么意思(月气深浅八字)
八字文案丧(八字短句超丧)
八字从伤官格条件(八字从伤)
云字八字成语大全(云字八字)
八字看突然爆发的人(暴发的八字)