线程中Synchronized关键字问题

原创 2018年04月15日 20:57:57

Java中每一个对象都有一个默认的锁或者是监视器(monitor),当访问某个对象的Synchronized方法的时候,表示将该对象上锁,这时候任何的线程都无法访问这个Synchronized方法了,直到该线程运行完毕或者发生异常的时候,该线程会释放锁。

public class ThreadTest4

{
public static void main(String[] args)
{
SynchTest st=new SynchTest();

Thread t1=new SynchThread1(st);

//st=new SynchTest();

Thread t2=new SynchThread2(st);

t1.start();

t2.start();
}
}
class SynchTest
{
public synchronized  void calc() 
{
for (int i = 0; i < 20; i++)
{
System.out.println("hello:"+i);
}
}

public synchronized  void calc2() 
{
for (int i = 0; i < 20; i++)
{
System.out.println("world:"+i);
}
}
}
class SynchThread1 extends Thread
{
private SynchTest st;


public SynchThread1(SynchTest st)
{
super();
this.st = st;
}

@Override
public void run()
{
// TODO Auto-generated method stub
super.run();
st.calc();
}
}
class SynchThread2 extends Thread
{
private SynchTest st;


public SynchThread2(SynchTest st)
{
super();
this.st = st;
}

@Override
public void run()
{
// TODO Auto-generated method stub
super.run();
st.calc2();
}

}


输出:

hello:0
hello:1
hello:2
hello:3
hello:4
hello:5
hello:6
hello:7
hello:8
hello:9
hello:10
hello:11
hello:12
hello:13
hello:14
hello:15
hello:16
hello:17
hello:18
hello:19
world:0
world:1
world:2
world:3
world:4
world:5
world:6
world:7
world:8
world:9
world:10
world:11
world:12
world:13
world:14
world:15
world:16
world:17
world:18

world:19

因为他们是同一个对象对线程方法的调用,因为是sybchronized方法,所以第一个对象引用的时候,对象上锁,第二个对象是无法进行访问的,所以先顺序的执行完第一个方法,然后再执行第二次。

重点:Thread t1=new SynchThread1(st);
//st=new SynchTest();

Thread t2=new SynchThread2(st);

如果在中间执行了st=new SynchTest();则会乱序,因为他们不是同一个对象了,都有自己的线程synchronized方法,谁强到的资源多谁执行!

多线程之synchronized关键字详解

synchronized关键字用于多线程访问程序中的共享资源时实现顺序同步访问资源。可以修饰方法或者代码块。而且关键字synchronized取得的锁都是对象锁,什么叫对象锁呢,就是一个对象产生一把锁...
  • Trigl
  • Trigl
  • 2016-04-15 20:23:17
  • 2857

java的线程同步机制synchronized关键字的理解

  • 2011年10月25日 22:54
  • 85KB
  • 下载

利用synchronized关键字解决线程安全问题

利用synchronized关键字解决线程安全问题        1.线程安全问题            当多条语句在操作同一个线程共享数据时,一个线程对多条语句操作的时候    ...
  • longlyboyhe
  • longlyboyhe
  • 2016-07-08 11:25:55
  • 832

android 线程 synchronized关键字

在android中为了提高更好的运行效果,免不了用到一些线程,当然更加免不了学习一些线程之间同步异步的知识,所以更加免不了学习获得锁之类的一些知识,这里就用到了synchronized关键字。 ...
  • lintcgirl
  • lintcgirl
  • 2015-05-01 19:14:30
  • 696

Java线程同步中关键字synchronized简述

Java线程同步中关键字synchronized简述 一、作用: synchronized关键字通过修饰一个方法或者声明一个代码块,从而产生一个同步对象锁以及对应的同步代码块。每当...
  • beiyus
  • beiyus
  • 2015-10-14 13:40:49
  • 2081

一个多线程synchronized引发的问题思考

/* * 查看程序,到底是输出多少? * */ public class TT implements Runnable { int b=0; public synchronized voi...
  • wxw520zdh
  • wxw520zdh
  • 2016-12-22 18:03:24
  • 296

Java线程的简单等待与唤醒【synchronized关键字】

java的线程唤醒与等待: package test; class Info{ private String name; private String content; private bool...
  • qq_19461913
  • qq_19461913
  • 2016-07-18 21:21:29
  • 324

深入理解Java并发4——synchronized关键字

一 概述 由上一篇博客(http://blog.csdn.net/xiaowang627/article/details/60584428),我们已经体验到synchronized关键字的强大之处...
  • xiaowang627
  • xiaowang627
  • 2017-03-07 13:36:35
  • 335

java多线程中的synchronized和wait/notify用法总结

自学java也有一段时间了,自我感觉java中的多线程还是比较重要的。至于线程的概念,也没有必要说的那么玄乎,引用马士兵老师的话就很好理解:线程就是程序执行的路径。多线程,也就不难理解了,程序执行的多...
  • gtkknd
  • gtkknd
  • 2016-01-21 15:42:54
  • 637
收藏助手
不良信息举报
您举报文章:线程中Synchronized关键字问题
举报原因:
原因补充:

(最多只允许输入30个字)