synchronized同步方法

来源:互联网 发布:php如何解决高并发问题 编辑:程序博客网 时间:2024/06/10 22:36

  1. 多个对象多个锁

package testSynchronized;public class Task {private int num = 0;synchronized public void addI(String username){try{if(username.equals("a")){num = 100;System.out.println("a set over");    Thread.sleep(1000);}else{num = 200;System.out.println("b set over");}System.out.println(username +" num = "+num);} catch (InterruptedException e) {e.printStackTrace();}}}package testSynchronized;public class Task {private int num = 0;synchronized public void addI(String username){try{if(username.equals("a")){num = 100;System.out.println("a set over");    Thread.sleep(1000);}else{num = 200;System.out.println("b set over");}System.out.println(username +" num = "+num);} catch (InterruptedException e) {e.printStackTrace();}}}package testSynchronized;public class ThreadB extends Thread {private Task task;public ThreadB(Task task){this.task = task;}@Overridepublic void run() {task.addI("b");}}package testSynchronized;public class Main {public static void main(String[] args) {Task task = new Task();ThreadA threada = new ThreadA(task);ThreadB threadb = new ThreadB(task);threada.start();threadb.start();}}运行结果:a set overa num = 100b set overb num = 200


结果:在多个线程访问同一对象(只有一个锁)的同步方法时一定是线程安全的。


那么多个对象多个锁的情况呢?

package testSynchronized;public class Main {public static void main(String[] args) {//Task task = new Task();ThreadA threada = new ThreadA(new Task());//每个线程多有自己的Task实例对象ThreadB threadb = new ThreadB(new Task());threada.start();threadb.start();}}运行结果:b set overa set overb num = 200a num = 100


本示例中两个线程分别访问同一个类的两个不同的实例的相同名称的同步方法,,效果是以异步的方式运行的。因为本实例中创建了2个任务对象(Task对象),所以会产生2个锁,threada和threadb线程分别获得各自Task实例的对象锁,所以可以异步执行。






0 0