synchronized&&threadLocal

来源:互联网 发布:下载超大字体软件 编辑:程序博客网 时间:2024/06/05 03:25

&&synchronized实现线程同步:
1 同步代码块
锁的是共享资源,当一个线程独占共享资源的锁时,其他的线程不能执行该同步代码块,只能等待,处于阻塞状态,使用同步代码块能保证同一时间只能该代码块且操作共享资源的只能有一个线程,即占用共享资源锁的该线程;
2 同步方法
synchronized关键字修饰类中的方法,表示该方法是同步方法,锁的是方法所在类的实例对象,即调用该方法的当前对象,同步方法能保证同一时间使用调用该方法的实例对象只有一个线程;

synchronized用法详解

synchronized修饰方法或代码块时,能够保证同一时刻调用该方法或代码块,最多只有一个线程;

修饰方法

访问修饰符之后,返回值类型之前,锁定的是调用该同步方法的当前对象,即同一时刻调用该同步方法的只有一个线程,并且此时,被锁定的对象(注意不是类,锁的其实就是存放在堆中的该对象的状态变量)有其他的同步方法,此时其他的线程也不能访问该对象的其他同步方法;但不同对象则没有影响,即此时别的线程依然可以访问不同实例的该同步方法(每一个对象在堆区中都有独立的一份内存来存储状态变量);

synchronized和lock的区别

相同点:lock能实现synchronized的所有功能;
不同点:synchronized自动释放锁,而lock必须程序员手动释放锁,且必须在finally从句中释放;
synchronized修饰方法时,表示同一对象在不同线程中表现为同步队列;如果实例化不同对象,那么synchronized就不会出现同步效果了;

对象的锁

所有对象都自动含有唯一的一个锁;
JVM负责跟踪对象被加锁的次数;当加锁次数为0时,对象解锁;在任务(线程)第一次给对象加锁的时候,计数变为1,每当相同的任务(线程)在此对象上获得锁时,计数加1;
只有首先获得该对象的锁的任务(线程)才能继续获取该对象上的多个锁;
每当任务(线程)离开一个synchronized方法时,计数减1,当计数变为0时,锁被完全释放,此时别的任务(线程)就可以使用此资源;

synchronized和threadlocal的区别

synchronized限制同一时刻访问共享资源的线程只有一个,通过控制访问的线程数(并行访问–》串行访问),保证了数据在多个线程之间的共享;
threadlocal则为每个线程都准备一份共享资源的副本,各个线程操作的只是共享资源的副本,同时不同线程之间不会受影响,保证了数据的隔离;
它们的本质区别:synchronized定位在多线程环境中保证数据共享的正确性,而threadLocal定位在多线程环境中数据的隔离,同一线程中数据传递的方便性;

原创粉丝点击