线程同步、线程异步
线程同步:
多个线程同时访问同一资源,等待资源访问结束,浪费时间、效率低
线程异步:
访问资源在空闲等待的同时访问其他资源,实现多线程
同步与异步的区别
同步最安全,异步容易导致死锁
实现线程安全
1.ThreadLocal:用空间换时间
把公用的对象,给不同的线程创建了一个独立的副本,从而隔离了多个线程对数据访问的冲突,因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal的使用 提供了线程安全的共享对象。
为每一个线程都提供了一份变量,因此可以同时访问而互不影响
方法:get()set(T value)
2.Synchronized:用时间换空间
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的可见性。
一.synchronized作用于实例方法
1.一个对象只有一把锁,一个线程获取了该对象的锁之后,其他线程无法获得该锁对象的锁,就不能访问该对象其他synchronized实例方法,但是可以访问非synchronized
2.其他线程来访问synchronized修饰的其他方法时需要等待线程1先把锁释放
3.当其他线程来访问非synchronized修饰的方法时是可以访问的
4.两个线程作用于不同的对象,获得的不同的锁,所以互相并不影响
二.synchronized作用于静态方法
两个线程实例化两个不同的对象,但是访问的方法是静态的,两个线程发生了互斥,因为静态方法是依附于类而不是对象的,当synchronized修饰静态方法时,锁是class对象
三.synchronized作用于同步代码块
如果当前有其他线程正持有该对象锁,那么新到的线程必须等待