关键字synchronized还可以应用在static静态方法上,这样写那是对当前的*.java文件对应的class类进行持锁,

测试如下

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{ @Override
public void run() {
super.run();
Service.printA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ @Override
public void run() {
super.run();
Service.printB();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA();
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB();
threadB.setName("b");
threadB.start();
}
}
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend Process finished with exit code 0

程序运行结果:

同步的效果,和将synchronized关键字加到非static方法上使用的效果一致,但还是存在本质上的区别,synchronized加到static静态方法上时给Class类上锁,而加到非static静态方法上是给对象上锁。

为了验证不是同一个锁,测试如下。

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } synchronized public void printC(){
System.out.println("printc ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printc ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{ @Override
public void run() {
super.run();
Service.printA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ @Override
public void run() {
super.run();
Service.printB();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadC extends Thread{ private Service service; public ThreadC(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printC();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB;
import com.cky.thread.ThreadC; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA();
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB();
threadB.setName("b");
threadB.start();
ThreadC threadC = new ThreadC(service);
threadC.setName("c");
threadC.start();
}
}
C:\itsoft\jdk\bin\java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\itsoft\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\itsoft\jdk\jre\lib\charsets.jar;C:\itsoft\jdk\jre\lib\deploy.jar;C:\itsoft\jdk\jre\lib\ext\access-bridge-32.jar;C:\itsoft\jdk\jre\lib\ext\cldrdata.jar;C:\itsoft\jdk\jre\lib\ext\dnsns.jar;C:\itsoft\jdk\jre\lib\ext\jaccess.jar;C:\itsoft\jdk\jre\lib\ext\jfxrt.jar;C:\itsoft\jdk\jre\lib\ext\localedata.jar;C:\itsoft\jdk\jre\lib\ext\nashorn.jar;C:\itsoft\jdk\jre\lib\ext\sunec.jar;C:\itsoft\jdk\jre\lib\ext\sunjce_provider.jar;C:\itsoft\jdk\jre\lib\ext\sunmscapi.jar;C:\itsoft\jdk\jre\lib\ext\sunpkcs11.jar;C:\itsoft\jdk\jre\lib\ext\zipfs.jar;C:\itsoft\jdk\jre\lib\javaws.jar;C:\itsoft\jdk\jre\lib\jce.jar;C:\itsoft\jdk\jre\lib\jfr.jar;C:\itsoft\jdk\jre\lib\jfxswt.jar;C:\itsoft\jdk\jre\lib\jsse.jar;C:\itsoft\jdk\jre\lib\management-agent.jar;C:\itsoft\jdk\jre\lib\plugin.jar;C:\itsoft\jdk\jre\lib\resources.jar;C:\itsoft\jdk\jre\lib\rt.jar;C:\多线程核心技术\第一章\out\production\第一章;C:\itsoft\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
printA ThreadNameabegin
printc ThreadNamecbegin
printc ThreadNamecend
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend

结果可见:

a和b和c是异步执行的,而不是按顺序执行的,因为一个是对象锁,一个是class锁,而class锁可以对所有的实例起作用

测试如下

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{
private Service service; public ThreadA(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ private Service service; public ThreadB(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printB();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service1 = new Service();
Service service2 = new Service();
ThreadA threadA = new ThreadA(service1);
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB(service2);
threadB.setName("b");
threadB.start(); }
}
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend

同步synchronized(class)代码块的作用和synchronized static 方法一样,

测试如下修改Service类如下

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { public static void printA() {
try {
synchronized (Service.class) {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} } catch (InterruptedException e) {
e.printStackTrace();
}
} public static void printB(){
synchronized(Service.class) {
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end");
} } }
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend

2.2.9静态同步synchronized方法与synchronized(class)代码块的更多相关文章

  1. 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

    1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...

  2. static方法,属性,代码块初始化顺序和执行顺序

    http://greateryang.blog.163.com/blog/static/81953375201232621031508/

  3. 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁

    一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...

  4. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  5. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  6. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  7. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

  8. java两种同步机制的实现 synchronized和reentrantlock

    java两种同步机制的实现 synchronized和reentrantlock 双11加保障过去一周,趁现在有空,写一点硬货,因为在进入阿里之后工作域的原因之前很多java知识点很少用,所以记录一下 ...

  9. 多线程同步锁和死锁以及synchronized与static synchronized 的区别

    线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序.简而言之:一个程序运行后至少有一个进程,一个进程 ...

随机推荐

  1. 瑞波Ripple-OnlineDeletion配置的理解

    1.概要 如果没有设置online deletion,那么Rippled Server的本地数据库大小将会无限增长.为了释放磁盘空间,那种情况应该被制止并且那些数据库文件应该被手动删除.online ...

  2. vmware磁盘空间扩展

    往vmware虚拟机中导入数据库或者文件以后经常出现磁盘空间不够用.这个时候就需要扩展一下磁盘的大小. 笔者本来60G,现在想扩展到100G 命令如下 D:\Program Files (x86)\V ...

  3. Oracle_高级功能(6) 分区

    oracle分区表1.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区. 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上 ...

  4. android如何判断控件的显示或者隐藏

    可以利用Android view getVisibility()的值来实现,具体如下: (1)0 -------- VISIBLE 可见(1)4 -------- INVISIBLE 不可见但是占用布 ...

  5. President's Office

    President of Berland has a very vast office-room, where, apart from him, work his subordinates. Each ...

  6. 探索未知种族之osg类生物---呼吸分解之事件循环二

    VPM矩阵 1.V 表示摄像机的观察矩阵(View Matrix),它的作用是把对象从世界坐标系变换到摄像机坐标系.因此,对于世界坐标系下的坐标值 worldCoord(x0, y0, z0),如果希 ...

  7. How to use GM MDI interface for programming

    GM has had its newest programming/J2534 Pass Thru device on the market for some years now. A lot has ...

  8. linux通过python设置系统默认编码

    import sys sys.reload() sys.getdefaultencoding() # 查看设置前系统默认编码 sys.setdefaultencoding('utf-8') sys.g ...

  9. BZOJ 3932 [CQOI2015]任务查询系统 - 差分 + 主席树

    Solution 差分就好了, 在$s_i$ 的点+1, $e_i + 1$ 的点 - 1. 查询的时候注意$l == r$ 要返回 $k * b[l]$ ,而不是$sum[node] $因为当前位置 ...

  10. Netty 源码 Channel(二)核心类

    Netty 源码 Channel(二)核心类 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.Channel 类图 二. ...