synchronized 基本用法
Posted lwdmaib
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized 基本用法相关的知识,希望对你有一定的参考价值。
常见三种使用方式
1)普通同步方法,锁是当前实例;
2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁;
3)对于同步代码块,锁是synchronized括号里配置的对象。
方式一 普通方法通过synchronized修饰
1)不采用synchronized 当创建两个线程对象 线程t1 t2中采用同一个实例化类对象 调用method方法 会交异步执行 互补影响
package cn.ac.bcc.sync; /** * 普通同步方法通过synchronized修饰 * @author Administrator * */ public class PtMethod { /** * 1)不采用synchronized修饰 * @param s */ public void method(String s){ if(s.equals("a")){ System.out.println(Thread.currentThread().getName()+": a"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println(Thread.currentThread().getName()+": b"); } } public static void main(String[] args) { //创建当前类对象实例 final PtMethod ptMethod = new PtMethod(); //创建线程 Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub ptMethod.method("a"); } }); Thread t2 = new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub ptMethod.method("b"); } }); t1.start(); t2.start(); } }
运行结果:
Thread-1: b
Thread-0: a
2)采用synchronized 当创建两个线程对象 线程t1 t2 中采用同一个实例化对象 调用synchronized修饰的method方法 method方法中线程睡眠一秒钟 当线程t1优先抢占到method方法的执行权时由于method方法被synchronized修饰 method方法被实例化对象ptMethod对象锁锁住 当t2线程同样是ptMethod实例化对象调用当前method方法 由于两个线程t1 t2 都采用的是同一个实例化对象ptMethod 对象锁 只有t1运行完成后 t2中线程中的ptMethod对象才能调用method方法。由于method中获取当前调用线程睡眠 t2要等t1中调用的method睡眠唤醒之后执行完方法才能执行。
public class PtMethod { /** * 1)采用synchronized修饰 * @param s */ public synchronized void method(String s){ if(s.equals("a")){ System.out.println(Thread.currentThread().getName()+": a"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println(Thread.currentThread().getName()+": b"); } } public static void main(String[] args) { //创建当前类对象实例 final PtMethod ptMethod = new PtMethod(); //创建线程 Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub ptMethod.method("a"); } }); Thread t2 = new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub ptMethod.method("b"); } }); t1.start(); t2.start(); } }
3)采用synchronized修饰
public class PtMethod { /** * 1)采用synchronized修饰 * @param s */ public synchronized void method(String s){ if(s.equals("a")){ System.out.println(Thread.currentThread().getName()+": a"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println(Thread.currentThread().getName()+": b"); } } public static void main(String[] args) { //创建当前类对象实例 final PtMethod ptMethod1 = new PtMethod(); final PtMethod ptMethod2 = new PtMethod(); //创建线程 Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub ptMethod1.method("a"); } }); Thread t2 = new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub ptMethod2.method("b"); } }); t1.start(); t2.start(); } }
以上是关于synchronized 基本用法的主要内容,如果未能解决你的问题,请参考以下文章