保证线程安全演进:

synchronized

volatile

AtomicInteger

Lock接口提供的方法:

void lock():加锁

void unlock():解锁

void lockInterruptibly():在多个线程并发获取锁的时候,那么,当有些线程拿不到锁时会等待,会不停的去抢占资源,在抢占的过程中,使用synchronized是无法进行中断的,那么,使用lockInterruptibly()方法,如果在抢占过程中发出一个中断,是可以中断的。

tryLock():非阻塞的获取锁,如果获取锁成功,返回true;否则,返回false

package com.roocon.thread.t9;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Sequence { private int value;
Lock lock = new ReentrantLock();//所有的线程用一把锁,来保证线程安全 public int getNext() {
lock.lock();
int a = value ++;
lock.unlock();
return a;
} public static void main(String[] args) { Sequence s = new Sequence(); new Thread(new Runnable() { @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); } }

运行结果:

Thread-0 0
Thread-2 2
Thread-1 1
Thread-0 3
Thread-1 5
Thread-2 4
Thread-0 6
Thread-1 7
Thread-2 8
...

Lock需要显示的获取锁和释放锁,繁琐能让代码更灵活;

使用Lock可以方便的实现公平性;public ReentrantLock(boolean fair){...}

非阻塞的获取锁;

能被中断的获取锁;

超时获取锁;(在一定时间内去获取锁)

synchronized不需要显示的获取锁和释放锁,简单

最新文章

  1. bzoj2693--莫比乌斯反演+积性函数线性筛
  2. Mysql有用的面试题
  3. ToString和Convert.ToString处理null值
  4. Media Player插件
  5. 设置centos7语言显示环境
  6. 放假回来啦!!小技能:一个div不给width,怎么让它居中捏?`(*∩_∩*)′
  7. python redis使用心得
  8. jQuery 跨域访问问题解决方法(转)
  9. FFmpeg 维基百科
  10. Android GridView 添加 网格线解决办法
  11. swift-01-利用元组判断字符串出现次数
  12. 我是怎么拿到百度2016校招Offer的——IT技术类校招成功面经
  13. app被Rejected 的各种原因翻译(转)
  14. AWS(0) - Amazon Web Services
  15. codeforces 236A . Boy or Girl(串水问题)
  16. Hive 常用函数
  17. 修改wampsever默认密码
  18. QT 读写配置文件 .ini
  19. 2017-9-24-Linux移植:ubuntu server 16.04无法联网&无法apt-get update解决
  20. 基于akka-http搭建restfull框架

热门文章

  1. vue element-ui el-date-picker如何限制选择时间为当天之前
  2. kubernetes 配置网络插件 flannel
  3. wireshark分析https数据包解密前后的特点
  4. viewer与 iview Carousel(走马灯) 结合使用,图片无法显示
  5. 使用Cloudera Manager搭建MapReduce集群及MapReduce HA
  6. Docker——概念学习
  7. 个性化排序算法实践(四)——GBDT+LR
  8. git教程——简单总结
  9. if __name__ == "__main__",python主程序入口
  10. VS调试web api服务