![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发与多线程
文章平均质量分 71
求知不倦
这个作者很懒,什么都没留下…
展开
-
Java 中的悲观锁和乐观锁的实现
锁(locking)业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法转载 2013-12-18 13:10:54 · 4536 阅读 · 0 评论 -
synchronized(object)的应用场景以及与synchronized修饰方法的区别
synchronized(object)的作用原理是:在object内有一个变量,当有线程进入时,判断是否为0,如果为0,表示可进入执行该段代码,同时将该变量设置为1,这时其他线程就不能进入;当执行完这段代码时,再将变量设置为0。虽然可以通过synchronized 关键字来修饰方法,但是不同的线程如果创建了各自的对象实例,多个对象实例调用方法时仍然是异步的。如果想保证代码块在任务情况下都同步,即代码块在程序的中同一时刻只被一个线程调用,即需要使用synchronized(object)。原创 2013-12-28 14:36:53 · 2201 阅读 · 0 评论 -
Executor框架
当看到以下形式的代码时:new Thread(runnable).start();时,如果希望用一种更灵活的执行策略,例如什么时候执行按照什么顺序执行(FIFO, LIFO, 优先级)等多少个任务并发执行一个任务执行前或后,应该进行什么操作。这时可考虑使用Executor代替Thread.start();public class TaskExecutionWebServer {原创 2013-12-20 14:53:15 · 618 阅读 · 0 评论 -
ConcurrentHashMap的使用场景以及与HashTable的比较
ConcurrentHashMap使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只有一个线程访问容器,而是使用一种粒度更细的加锁机制来实现更大程度的共享,这种机制成为分段锁(lock striping)。这种机制中,任意数量的读取线程都可以并发访问Map,并且一定数量的线程可以并发修改Map。好处是:在并发环境原创 2013-12-20 14:45:23 · 6000 阅读 · 0 评论 -
java多线程基础知识:如何编写线程安全代码
我们编写程序时经常犯错的几个地方:1、以为i++是原子操作,其实不然,i++是分两步完成的,所以当我们在多个线程并发操作时就可能产生错误,例如以下代码:public class UnsafeSequence{ private int value; public int getNext(){ return value++; }}在多线程时:原创 2013-12-17 18:38:31 · 1567 阅读 · 0 评论 -
ThreadLocal的用法
使用ThreadLocal是维持线程封闭的一种更规范的方法。其实就是通过ThreadLocal的set方法,使每个线程都拥有一个自己的对象,其他线程是不需要访问的,也访问不到的,这样的就不产生多个线程共同使用一个对象的问题。但注意,set进去的对象必须是调用着自己创建的,并且需要自己保证跟其他set进去的对象不是相同的引用。如果ThreadLocal.set()进去的东西本来就是多个线程共享的原创 2013-12-20 10:51:34 · 605 阅读 · 0 评论 -
实现线程安全的一些方法
1、不变的对象一定是线程安全的,满足以下条件的对象是不变的。对象没有变量,只有方法。对象创建后,状态就不能修改。对象的所以变量都是final型。对象被正确创建(创建时,this没有被逸出)2、实例封闭 将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁。public class PersonSet {原创 2013-12-20 11:26:16 · 1327 阅读 · 0 评论 -
多线程中的数据共享
多线程中的可读性问题在多线程访问同一个对象的变量时,如果read操作和write操作分别在两个不同的线程中,read操作并不能保证马上获取到write操作修改后的值。因为在没有同步的情况下,编译器、处理器以及运行时都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得到正确的结论。例如以下代码有可能会输出0,并且会无原创 2013-12-18 14:54:53 · 1170 阅读 · 0 评论 -
线程7种状态的相互转换
今天有同事问到线程的问题,自己突然就有点蒙了,只模糊的记得个大概。当初学习线程的时候把这7个状态记得比自己名字还熟悉还把这7个状态编成了一段凄惨而美丽的爱情故事没想到如今却只能记得个大概真验证了“好记性不如烂笔头”的真理还是赶快回忆一下吧先从图片开始小小的作下解释:1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样转载 2013-12-20 14:09:19 · 562 阅读 · 0 评论 -
一些错误的线程安全写法
1、使用List时的加锁代码但使用synchronized声明的方法锁住的是调用该方法的对象,而不是提供方法的对象。所以上例的代码中,list对象并没有被锁住,如果有其他方法也是有相同的判断为空即添加的代码,就可能重复添加了。正确的写法:原创 2013-12-20 12:05:05 · 798 阅读 · 0 评论