死锁就是:一个宝藏需要两把钥匙来打开,同时间正好来了两个人,他们一人一把钥匙,但是双方都再等对方能交出钥匙来打开宝藏,谁都没交出自己的那把钥匙.就这样这俩人一直僵持下去,直到开发人员发现这个局面.
上面代码就是一个死锁
导致死锁的原因在于
线程①先拿到同步函数的this锁,在拿到同步代码块中的lock锁
线程②先拿到同步代码块中的lock锁,在拿到同步函数的this锁
互补释放锁导致的
解决死锁的方法:
不要嵌套同步代码块
死锁就是:一个宝藏需要两把钥匙来打开,同时间正好来了两个人,他们一人一把钥匙,但是双方都再等对方能交出钥匙来打开宝藏,谁都没交出自己的那把钥匙.就这样这俩人一直僵持下去,直到开发人员发现这个局面.
上面代码就是一个死锁
导致死锁的原因在于
线程①先拿到同步函数的this锁,在拿到同步代码块中的lock锁
线程②先拿到同步代码块中的lock锁,在拿到同步函数的this锁
互补释放锁导致的
解决死锁的方法:
不要嵌套同步代码块
函数所非常简单
只需要在函数定义的时候加上synchronized关键字就可以了
那么synchronized用的是什么锁呢
答:this锁,怎么知道他是this锁的呢
sell1用的是this锁
sell2用的是函数锁
当我们把sell1函数中的同步代码块的this锁换成lock锁就会发现数据不同步
那为什么上面代码能证明函数锁就是this锁呢
前面我们说过需要同一把锁才可以进行线程发生同步上面运行结果很明显可以清楚的看到线程发生了同步足以说明函数锁就是this锁
总结:
1.如果一个线程函数锁另一个线程使用this锁那么是可以同步的
2.如果一个线程函数锁另一个线程使用同步代码块(
上面代码使用了synchronized代码块进行数据的同步,使用synchronized的时候不要全部代码用synchronized代码块包裹,只要包裹可能会出现线程安全问题的地方就行了
锁:
比如上厕所锁了门,必须要等里面的认出来了其他人才能抢厕所
使用synchronized的条件:
1.必须有两个线程以上,并且需要发生同步
2.多个线程同步,必须用同一把锁
3.保证只有一个线程进行执行
原理:
1.当一个线程拿到锁了,其他线程已经有cpu执行,需要排队等待其他线程释放锁。
2.代码执行完毕或者抛出异常是就会释放锁
3.锁被释放掉的话,其他贤臣刚开始抢夺锁进去同步中区
首先什么是线程安全问题?
答:当多个线程同时修改做写操作的时候可能受到其他线程的干扰导致数据出现问题这种现象叫做线程安全问题
举个例子比如火车票自动售票机,原本有100张票分别有两个售票机进行判断票数是否大于0,如果票数大于0就把票出售给乘客,但当两个售票机同时读取这个变量的时候第一个判断大于0就售出了但第二个判断也大于0但前面第一个线程已经把票售出了所以此时是0张票这个时候就可能出现了-1张票,或者售出了同一张票
可以看到上面售出了同一张票还售出了101张票
总结:
多线程同时对一个变量进行写操作并且需要是同一个全局变量就会导致线程安全问题
pip install python-docx #安装docx
doc = Document() # 创建空白doc文档
head = doc.add_heading(“”, level=1) #添加标题 level是当前标题的索引
run = head.add_run(“Python操作模块doxc操作Word文档”)
head.alignment = WD_ALIGN_PARAGRAPH.CENTER#居中
run.font.size = Pt(23) #字体大小单位有pt,mm,cm
run.font.color.rgb = RGBColor(1, 1, 1) # 引用颜色库里的颜色
但是往往很多情况下我们需要几种类型配套使用,就比如说你用变量描述一个人,这个人不止有int属性
如身高,体重为浮点型,名字为字符串,年龄为int
这时候我们就需要定一个一个新类型
结构体实际上和数组也差不多
只不过是不同类型
比如说一个结构体中有两个int一个char类型
那么他就会申请9个内存单元
因为int2+char1=4*2+1=9
分给两个int和chart
所以结构体的本身就是个地址
ide会根据你定义的结构体让你能指向他其中的元素
结构体a里面有name和age还有height三个元素,我们表层访问是不是(*a).
事情是这样的我接了个单子就是写微信登陆和支付的
一开始我接单子的时候想之前都写过qq登录微信也应该差不多结果我错了首先遇到的坑有
sdk的配置他是把sdk放到了maven远程仓库然后直接compile但是我as抽风好了许久最终下载了官方的demo找到了jar直接copy到工程文件夹里了
我边写边吐槽写文档的开发者乱七八糟后来我看着官方demo改的终于成功了。于是就有了这篇文章
登录的class名称必须是WXEntryActivity并且继承activity实现IWXAPIEventHandler接口否则无法回调
然后剩下的直接上图了
微信登录和qq登录不同他是先把回调返回来的co
和上个文章一样也是接的单子开发文档也是很花里胡哨让人蛋疼折腾了一个下午终于搞定了
第一个坑:
回调不了
这里和上文章的登录回调有一点不同
也是要在wxapi包下名字必须是WXPayEntryActivity
配置清单的时候记得加上android:exported=”true”否则会导致无法启动回调的activity
第二个坑订单会话id
获取订单会话id的时候需要传入很多花里胡哨的参数甚至支付的客户端IP都要提交其实没必要这么麻烦的
只要提交这几个参数即可
appid,mch_id,nonce_str,body,out_trade_no,total_fee,notify_url,trade_type,s
微信提供了一个回调的接口只要把我们的后台接口传过去微信就会调用我们的回调接口。
传的是xml的所以我们php段不能再用$_POST来接受微信回调传过来的数据。。
应该改成如下
callback就是微信传过来的回调内容
我们需要把他转换成array数组方便读取,代码如下
微信的金额单位不是元是分所以用下面代码转换成元
下面是完整代码
我们首先了解一下 Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用
发送简单的get请求
python2
import urllib2
response = urllib2.urlopen(‘http://www.baidu.com‘)
python3
import urllib.request
res = urllib.request.urlopen(‘http://www.baidu.com‘)
read()方法返回的是字节数据decode就是解码把字节数据转string
decode可传参数
有时候可能出现一个问题