一、Synchronized
1.作用
a. 多线程同步代码,保证方法或者代码块在运行时,同一时刻只有一个线程可以进入到临界区(互斥性)
c. 有效解决重排序问题(有序性)
2. 用法:
a. 修饰函数,即普通同步方法,锁是当前实例对象 public void synchronized A(){}
b. 静态同步方法,锁是当前类的class对象 public static void synchronized A(){}
c. 修饰函数内的语句块,即同步代码块,锁是括号中的对象 synchronized(obj){}
d. Java中的每个对象都可以作为锁,获取的锁都是对象
e. 每个对象只有一个锁(lock)与之关联
f. 同步需要很大的系统开销,可能造成死锁;尽量避免无谓的同步
3. 作用域
a. 某个对象实例内的方法,不同对象的实例内的方法不相干扰,其他线程可以同时访问相同类的其他对象实例中的synchronized方法
b. 某个类的范围,一般是静态方法,可以防止多个线程同时访问相同类中的synchronized方法
4、wait(),notify(),notifyall()进行线程间通信
a. 例如生产者消费者模式,生产者发现缓冲区满了,就wait(),消费者从缓冲区消费了,就notify()或者notifyall()
b. 必须放在synchronized块中,否则,如果缓冲区只有一个产品,消费者先notify(),生产者再wait(),就会进入死锁
5、锁的状态
a. 无状态
b. 偏向锁状态
c. 轻量级锁状态
d. 重量级锁状态
1. 当使用手把手的进行锁获取和释放,使用synchronized关键字不容易实现,所以引入lock
2. 在代码中使用
Lock lock = new reentrantlock(); Condition condition = lock.newCondition(); lock.lock(); try { while(条件判断表达式) { condition.wait(); } // 处理逻辑 } finally { lock.unlock(; }
参考:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。