同步:synchronized
同步的概念就是共享,如果不是共享的资源就没必要进行同步。
异步:asynchronized
异步的概念就是独立,相互之间不受任何制约。
同步的目的是为了线程安全,其实对于线程安全来说需要满足两个特性:
原子性(同步)
可见性
示例:
/** * 对象锁的同步和异步问题 * @author Vision_TXG * */ public class MyThread03 { public synchronized void method1() { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(4000); }catch(Exception e) { e.printStackTrace(); } } /**synchronized*/ //注意在method2上加synchronized锁的输出结果 public /*synchronized*/ void method2() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { final MyThread03 m = new MyThread03(); Thread t1 = new Thread(new Runnable() {
@Override public void run() { // TODO Auto-generated method stub m.method1(); } },"t1"); Thread t2 = new Thread(new Runnable() {
@Override public void run() { // TODO Auto-generated method stub m.method2(); } },"t2"); t1.start(); t2.start(); } } |
示例总结:
T1线程先持有对象的Lock锁,T2线程如果在这个时候调用对象中的同步(synchronzied)方法则需要等待,也就是同步。
T1线程先持有对象的Lock锁,T2线程可以以异步的方式调用对象中非synchronized修饰的方法。