Java_慎用方法级别的synchronized关键字
为什么要这么说呢, 因为笔者被这个坑过(其实是自己坑自己)╮(╯_╰)╭
synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
synchronized void  a(){
  countDownLatch = new CountDownLatch(1);
  // do someing
  countDownLatch.await();
}
synchronized void b(){
     countDownLatch.countDown();
}
byte[]  mutex = new byte[0];
void a1(){
     synchronized(mutex){
          //dosomething
     }
}
void b1(){
     synchronized(mutex){
          // dosomething
     }
}
public class MultiThreadSync {
    public synchronized void m1() throws InterruptedException{
         System. out.println("m1 call" );
         Thread. sleep(2000);
         System. out.println("m1 call done" );
    }
    public void m2() throws InterruptedException{
          synchronized (this ) {
             System. out.println("m2 call" );
             Thread. sleep(2000);
             System. out.println("m2 call done" );
         }
    }
    public static void main(String[] args) {
          final MultiThreadSync thisObj  = new MultiThreadSync();
         Thread t1 = new Thread(){
              @Override
              public void run() {
                  try {
                      thisObj.m1();
                 } catch (InterruptedException e) {
                      e.printStackTrace();
                 }
             }
         };
         Thread t2 = new Thread(){
              @Override
              public void run() {
                  try {
                      thisObj.m2();
                 } catch (InterruptedException e) {
                      e.printStackTrace();
                 }
             }
         };
         t1.start();
         t2.start();
    }
}
                                        void method(){
void synchronized method(){                 synchronized(this){
      // biz code                               // biz code
}                             ------>>>      }
                                        }												
											Java_慎用方法级别的synchronized关键字的更多相关文章
- 改代码不是很熟悉------方法上加入synchronized关键字,会有性能问题---如何改善
		package com.bjpowernode.t14; import java.time.Duration;import java.time.LocalTime; public class Proc ... 
- volatile与synchronized关键字
		volatile关键字相信了解Java多线程的读者都很清楚它的作用.volatile关键字用于声明简单类型变量,如int.float.boolean等数据类型.如果这些简单数据类型声明为volatil ... 
- java synchronized关键字浅析
		synchronized这个关键字想必学Java的人都应该知道. 直接上例子: 方法级别实例 public class AtomicInteger { private int index; publi ... 
- Java多线程学习(二)synchronized关键字(1)
		转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ... 
- Java 多线程 —— synchronized关键字
		java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ... 
- synchronized关键字小结(一)
		1. synchronized同步方法 1) synchronized修饰方法,表示方法是同步的,当某线程进入并拿到当前整个对象的锁时 a. 其他synchronized方法排队等锁 b. 非sync ... 
- Java多线程初学者指南(10):使用Synchronized关键字同步类方法
		要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() { ... } 从上面的代码可 ... 
- java基础回顾(五)线程详解以及synchronized关键字
		本文将从线程的使用方式.源码.synchronized关键字的使用方式和陷阱以及一些例子展开java线程和synchronized关键字的内容. 一.线程的概念 线程就是程序中单独顺序的流控制.线程本 ... 
- Java并发之synchronized关键字
		上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型的问题,针对它们,synchronize ... 
随机推荐
- go语言项目汇总
			Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ... 
- Autofac Named命名和Key Service服务
			参考:http://www.cnblogs.com/wolegequ/archive/2012/06/03/2532605.html 
- Windows 8 应用程序前后台切换事件监听
			在一些情况下,我们需要监听应用程序切换到后台或者从后台切换至前台的事件,从而进行相关处理操作.支付宝应用锁屏(IOS,Android平台)的处理中就需要监听此事件,在用户将应用切换至后台一段时间后再切 ... 
- Linux入门(二)Shell基本命令
			上一篇讲了普通用户切换到root用户,今天补充一点,对于Debian和Ubuntu用户,安装时候只有一个普通用户注册,在需要root权限时,我们可以在普通用户模式下输入sudo这个命令运行某些相关特权 ... 
- Struts – MappingDispatchAction Example
			Struts MappingDispatchAction class is used to group similar functionality into a single action class ... 
- AutoCompleteTextView,Spinner,消息提示
			package com.example.wang.testapp2; import android.app.Notification; import android.app.NotificationM ... 
- Asp.net MVC NPOI导出Excel
			public class NpoiMemoryStream : MemoryStream { public NpoiMemoryStream() { AllowClose = true; } publ ... 
- Asp.net Vnext  实现IView
			概述 Iview定义很简单,就是根据View上下文和TextWriter对象实现对View的呈现. 实现 实现IViewEngine public class TestViewEngine : IVi ... 
- java.lang.NoClassDefFoundError: ognl/PropertyAccessor
			本篇对 Web 开发中,项目部署后.开启 Tomcat 服务器 Console 控制台报错 java.lang.NoClassDefFoundError: ognl/PropertyAccessor ... 
- openfire 部署后报错: java.lang.IllegalArgumentException: interface xx is not visible from class loader
			该异常是创建代理时加载接口的类加载器与创建时传入的不一致. 在本地eclipse做openfire二次开发,本地运行没错,部署到服务器上后报异常: java.lang.IllegalArgument ... 
