您的位置:首页 > 编程语言 > Java开发

关于Java 锁学习的笔记

2018-04-20 11:55 246 查看

锁就是在类的对象上或者类上的标记信息

synchronized关键字

Object o=new Object();

Sync(o) 代表的含义是 锁住o指向的对象,锁定的是一个对象,而不是{}里的代码。代表的含义是:如果想执行{}里面的代码,必须先申请o这个对象的锁。如果第一个线程已经申请了,得二个线程就得在外面等待锁释才能执行{}里面得代码。互斥锁

public sync void a(){}===>sync(this){}

public sync static void a(){}===>sync(T.class) //静态方法没有this

同步方法和非同步方法可以同时执行,只是同步方法需要申请锁。

如果写方法加锁,读方法不加锁。容易出先脏读,会读写还未完成得操作

同一个线程里面,同步方法可以调用同步方法,只是在锁得标记信息+1 (重入锁)

两个线程得通信:1.共享内存 2.互相发消息 java多线程得通信模型

当两个线程访问同一块内存时才需要同步

sync遇到异常锁会被释放

voliate关键字 使多个线程透明可见,具有内存可以性,禁止指令重排序

java 对线程处理得内存模型:



不用voliate读完只会就不去再去主内存读数据(不一定,cup空闲也可能会更新,只是不确定),别的线程改了之后会更新到主内存

加了voliate之后会通知其他线程更新缓存

只保证可见性,有读写得时候可能值不一致,没来得及收到更新。对于这一块得操作可以使用java具有原子性得操作类,比如数字操作AtomicInteger

wait()等待和notify()唤醒是配对的,但是notify()不会释放锁。

多线程直接通信用current包中的CountDownLatch

lock.lock()====>sync(this) 手动锁,需要在finally中调用lock.unlock

lock.tryloock()返回ture/false 代表尝试锁定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java