synchronized是以排队的方式进行处理多线程访问的,调用前先判断有没有上锁,如果上锁则会等待,在等待过程中会一直尝试获取这把锁,多个线程同时争这把锁。此外,只有共享资源读写访问才需要同步化,不是共享资源则没有同步的必要。
示例:
定义普通类和方法线程A 线程B
测试一
测试二
synchronized取得的锁都是对象锁,而不是把一段代码或者是一个方法当作锁,所以在上面的示例中(测试一所示),哪一个线程先执行带synchronized关键字的方法,那个线程就持有该方法所属对象的锁lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象!如果多个线程访问多个对象,则Jvm会创建多个锁(测试二所示)
网友评论