1、介绍
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。
2、修饰对象
2.1、修饰this,当前对象,这里的this指的是执行这段代码的对象,synchronized得到的锁就是this这个对象的锁。
线程thread1 访问对象testSy1的带有同步代码块的add()时,其他线程可以访问该对象的add()方法吗?
public class TestSy1 implements Runnable{ private int number; TestSy1(){ number = 0; } public void add(){ synchronized (this){ for(int i=0;i<4;i++){ try{ System.out.println(Thread.currentThread().getName()+":thread:"+(number++)); Thread.sleep(500); }catch (Exception e){ System.out.println("异常"); } } } System.out.println("add"); } public void show(){ for (int i = 0; i < 5; i++) { try { System.out.println(Thread.currentThread().getName() + " 非同步:" + number); Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("show"); }
@Override public void run() { String name = Thread.currentThread().getName(); if(name.equalsIgnoreCase("thread1")){ add(); }else{ add(); } } public static void main(String[] args){ TestSy1 testSy1 = new TestSy1(); Thread thread1 = new Thread(testSy1,"thread1"); Thread thread2 = new Thread(testSy1,"thread2"); thread1.start(); thread2.start(); } }
结果如下:
thread1:thread:0 thread1:thread:1 thread1:thread:2 thread1:thread:3 thread2:thread:4 thread2:thread:5 thread2:thread:6 thread2:thread:7 可见,其他线程不能访问add()方法。