java多线程-synchronized对象和方法的区别
2017-10-14 10:51
295 查看
public class App { public static void main(String[] args) { System.out.println("Synchronized Objects: "); Worker worker = new Worker(); worker.main(); System.out.println("Synchronized Methods: "); WorkerMethodsSynchronized worker2 = new WorkerMethodsSynchronized(); worker2.main(); } }
public class Worker { private Random random=new Random(); private final Object lock1=new Object(); private final Object lock2=new Object(); private List<Integer> list1=new ArrayList<>(); private List<Integer> list2=new ArrayList<>(); public void stageOne(){ synchronized (lock1){ try { Thread.sleep(1); }catch (InterruptedException e){ e.printStackTrace(); } list1.add(random.nextInt(100)); } } public void stageTwo(){ synchronized (lock2){ try { Thread.sleep(1); }catch (InterruptedException e){ e.printStackTrace(); } list2.add(random.nextInt(100)); } } public void process(){ for(int i=0;i<1000;i++){ stageOne(); stageTwo(); } } public void main() { System.out.println("Starting ..."); long start=System.currentTimeMillis(); Thread t1=new Thread(new Runnable() { @Override public void run() { process(); } }); Thread t2=new Thread(new Runnable() { @Override public void run() { process(); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); }catch (InterruptedException e){ e.printStackTrace(); } long end=System.currentTimeMillis(); System.out.println("time taken "+(end-start)); System.out.println("List1:"+list1.size()+" List2:"+list2.size()); } }
public class WorkerMethodsSynchronized { private Random random = new Random(); private List<Integer> list1 = new ArrayList<>(); private List<Integer> list2 = new ArrayList<>(); /** * synchronized, methods use different data (list1 list2) so by synchronized * methods if one thread runs the stageOne other thread cannot run stageTwo * at the same time because that same locks are used. Solution is using two * lock Object for two shared data. */ public synchronized void stageOne() { try { //do your work here Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } list1.add(random.nextInt(100)); } public synchronized void stageTwo() { try { //do your work here Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } list2.add(random.nextInt(100)); } public void process() { for (int i = 0; i < 1000; i++) { stageOne(); stageTwo(); } } public void main() { System.out.println("Starting ..."); long start = System.currentTimeMillis(); Thread t1 = new Thread(new Runnable() { public void run() { process(); } }); Thread t2 = new Thread(new Runnable() { public void run() { process(); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException ignored) {} long end = System.currentTimeMillis(); System.out.println("Time taken: " + (end - start)); System.out.println("List1: " + list1.size() + "; List2: " + list2.size()); } }
输出:
Synchronized Objects:
Starting …
time taken 2598
List1:2000 List2:2000
Synchronized Methods:
Starting …
Time taken: 5184
List1: 2000; List2: 2000
可见Synchronized 方法更耗时间
解析:
就是弄个循环往两个list加入随机值
相关文章推荐
- java多线程之-----对象及变量的并发访问1(synchronized同步方法)
- Java synchronized 对象锁与类锁的区别、同步代码块与同步方法的区别 详解
- Java多线程之Synchronized应用在static和非static方法上的区别
- Java的synchronized加在方法上或者对象上有什么区别?
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- Java多线程总结(二):理解对象锁 & synchronized和Lock的区别
- java synchronized对象锁与类锁的区别、同步代码块与同步方法的区别
- java多线程----synchronized方法锁能否锁住对象呢?
- Java synchronized 对象锁与类锁的区别、同步代码块与同步方法的区别 详解
- java多线程下synchronized修饰static方法与非static方法的区别
- Java的synchronized加在方法上或者对象上有什么区别?
- java synchronized 方法 对象 区别
- 初学Java多线程:使用Synchronized关键字同步类方法
- Java多线程-run方法与start方法的区别
- 九、初学Java多线程:使用Synchronized关键字同步类方法
- (转)初学Java多线程:使用Synchronized关键字同步类方法
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
- java创建多线程方法之间的区别
- 黑马程序员 Java学习总结之多线程中start方法和run方法的区别(这个一定要搞清楚)