- 浏览: 355480 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
yuantingjun:
老大,能参考下代码吗?
2天弄了个个人网站 -
yuantingjun:
这么牛啊。 膜拜一二
2天弄了个个人网站 -
guzizai2007:
toknowme 写道兄弟,在哪里买的空间啊~求链接~~阿里云 ...
2天弄了个个人网站 -
toknowme:
兄弟,在哪里买的空间啊~求链接~~
2天弄了个个人网站 -
haoran_10:
不错,赞一个
2天弄了个个人网站
1、synchronized关键字:
1)、可用来修饰一个方法或代码块 2)、作用:保证在同一时刻只能有一个线程来访问当前对象的这段代码
2、例子(对代码块加锁,两个线程同时跑,一定要等第一个线程执行完跑完,第二个才执行):
package com.sxit.test; public class Test implements Runnable{ public static void main(String[] args) { Test test1 = new Test(); Thread thread1 = new Thread(test1,"线程1"); Thread thread2 = new Thread(test1,"线程2"); thread1.start(); thread2.start(); } public void run() { //对当前对象加锁,同一时刻只能有一个线程持有当前对象的锁,一定要等第一个线程执行完,锁释放后,第二个线程才开始跑 synchronized (this) { for(int i = 0 ;i<50;i++){ System.out.println("当前线程是:"+Thread.currentThread().getName()+"------>>>跑到"+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } } -----------打印信息(太长,只截取一部分)----------- 当前线程是:线程1------>>>跑到0 当前线程是:线程1------>>>跑到1 当前线程是:线程1------>>>跑到2 当前线程是:线程1------>>>跑到3 当前线程是:线程1------>>>跑到4 当前线程是:线程1------>>>跑到5 。。。。。。。。。。。。。。。。。 当前线程是:线程1------>>>跑到49 当前线程是:线程2------>>>跑到0 当前线程是:线程2------>>>跑到1 当前线程是:线程2------>>>跑到2 当前线程是:线程2------>>>跑到3 当前线程是:线程2------>>>跑到4 当前线程是:线程2------>>>跑到5 当前线程是:线程2------>>>跑到6 。。。。。。。。。。。。。。。。。 当前线程是:线程2------>>>跑到49
3、例子(一个线程访问当前对象同步方法,另外一个线程可以访问该对象的非同步方法):
package com.sxit.test; public class Test implements Runnable{ public static void main(String[] args) { Test test1 = new Test(); //启一个线程 Thread thread1 = new Thread(test1,"线程1"); thread1.start(); //当前线程执行test方法 test1.test(); } public void run() { //对当前对象加锁,同一时刻只能有一个线程持有当前对象的锁,一定要等第一个线程执行完,锁释放后,第二个线程才开始跑 synchronized (this) { for(int i = 0 ;i<50;i++){ System.out.println("当前线程是:"+Thread.currentThread().getName()+"------>>>跑到"+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void test(){ try { for(int i = 0 ;i<50;i++){ Thread.sleep(100); System.out.println("当前线程是:"+Thread.currentThread().getName()+"----->>>访问非同步方法"+i); } } catch (InterruptedException e) { e.printStackTrace(); } } } ----------打印结果------------- 当前线程是:线程1------>>>跑到46 当前线程是:main----->>>访问非同步方法45 当前线程是:main----->>>访问非同步方法46 当前线程是:线程1------>>>跑到47 当前线程是:线程1------>>>跑到48 当前线程是:main----->>>访问非同步方法47 当前线程是:main----->>>访问非同步方法48 当前线程是:线程1------>>>跑到49 当前线程是:main----->>>访问非同步方法49
4、例子:(当一个线程访问synchronized声明的代码块时,别的线程访问其他synchronized代码块时将被堵塞):
package com.sxit.test; public class Test implements Runnable { public static void main(String[] args) { Test test1 = new Test(); // 启一个线程 Thread thread1 = new Thread(test1, "线程1"); thread1.start(); try { //主线程先睡一会儿,让线程1先执行 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 当前主线程main执行test方法将被堵塞,知道线程1执行完释放当前对象锁才能执行test方法 test1.test(); } public void run() { // 对当前对象加锁,同一时刻只能有一个线程持有当前对象的锁,一定要等第一个线程执行完,锁释放后,第二个线程才开始跑 synchronized (this) { for (int i = 0; i < 100; i++) { System.out.println("当前线程是:" + Thread.currentThread().getName() + "------>>>跑到" + i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void test() { synchronized (this) { for (int i = 0; i < 50; i++) { System.out.println("当前线程是:" + Thread.currentThread().getName() + "----->>>访问非同步方法" + i); } } } } ---------打印信息----------- 当前线程是:线程1------>>>跑到1 当前线程是:线程1------>>>跑到2 。。。。。。。。。。。。。。。。 当前线程是:线程1------>>>跑到49 当前线程是:线程main------>>>跑到1 。。。。。。。。。。。。。。。。 当前线程是:线程main------>>>跑到49
5、Thread类中start()方法源码:
/** * Causes this thread to begin execution; the Java Virtual Machine * calls the run method of this thread. * 线程开始执行;JVM会调用该线程的run方法,也就是调用Runnable的run方法 见源码即: * public void run() { * //target是构造器传入的Runnable对象,如果不为空,则调用它的Run方法 * if (target != null) { * target.run(); * } * } * * The result is that two threads are running concurrently: the * current thread (which returns from the call to the * start method) and the other thread (which executes its * run method). * * It is never legal to start a thread more than once. * 重复调用start方法启动线程是非法的 * In particular, a thread may not be restarted once it has completed * execution. * 如果线程已经执行完毕,不能再重复启动了 * 见源码started标示 * * @exception IllegalThreadStateException if the thread was already * started. */ //synchronized关键字修饰,防止同一时刻有多个线程一起启动 public synchronized void start() { if (started) throw new IllegalThreadStateException(); //如果已经启动了,则started标示为true,下一次启动直接抛出异常 started = true; //将当前线程加入到线程组中 group.add(this); start0(); } // native方法里执行 闭源无法看到 private native void start0(); public void run() { if (target != null) { target.run(); } }
6、小结:
1)、每个类实例都对应一把锁,如果你要访问该对象的synchronized方法,你就首先得先获得这把锁,否则所属线程阻塞,方法一旦执行,就独占此锁,知道方法返回后才将锁释放,被阻塞的线程也就可以去争取这个锁了。
发表评论
文章已被作者锁定,不允许评论。
-
IO模型
2014-03-14 12:14 649IO请求的两个阶段: 等待资源阶段:IO请求 ... -
Java IO流
2013-05-18 19:25 730Java流操作有关的类或接口: Java流类图结构: ... -
Comparable
2013-05-14 14:10 8831、问题:页面有个排序列表,有name和age,后台为一个A ... -
ReentrantLock锁的获取与释放
2013-05-08 16:52 1183java.util.concurrent.loc ... -
ArrayBlockingQueue
2013-05-08 14:24 782java.util.concurrent 类 Arr ... -
HashMap相关
2013-05-08 11:14 986要谈ConcurrentHashMap的构 ... -
线程池
2013-04-24 14:54 8001、一个阻塞队列,用来存放执行的任务: package c ... -
类初始化顺序
2013-04-24 10:23 6821、单个类:静态变量---静态代码块---代码块---构造函 ... -
Lock和Condition
2013-04-18 17:55 68621、jdk1.5之前用synchornized和voatil ... -
java基础面试题
2013-04-01 19:10 01、int和Integer区别? ----------- ... -
定时任务Timer使用
2013-03-28 17:06 8801、任务基类: package com.sxit.comm ... -
遍历、删除文件夹所有文件
2013-03-05 17:18 178package com.sxit; import ja ... -
多线程之原子操作(java.util.concurrent.atomic)
2013-03-04 22:18 01、一个简单的程序,多线程对同一个值进行i++操作: pa ... -
java序列化和serialVersionUID
2013-02-23 23:45 133761、序列化: 序列化 ... -
字符串String与字符串池StringPool
2013-02-21 15:27 790新建String对象到底生成几个对象呢?下面将对其进行详 ... -
volatile
2013-01-29 15:51 518 -
内部类中.this使用
2013-01-09 16:51 838private class Itr implements ... -
Integer自动装箱问题
2013-01-02 16:34 8351、测试类: public class IntegerTes ... -
Executors类
2012-11-12 18:09 0package java.util.concurrent; ... -
ExecutorService接口
2012-11-12 15:58 0package java.util.concurrent; ...
相关推荐
java同步synchronized关键字用法示例
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...
Java 中的 synchronized 关键字与线程平安问题 在 Java 中,synchronized 关键字是一个非常重要的概念,它用于解决线程同步问题。但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 ...
synchronized关键字在java中的重要性 以及常用的方法 还有它的详解
Java 并发编程 Synchronized 关键字实现原理 Synchronized 关键字是 Java 并发编程中最基本的同步机制,它可以保证线程安全,包括原子性、可见性和有序性。Synchronized 关键字可以修饰方法或代码块,使得在同一...
Synchronized关键字的用法
Lock接口与synchronized关键字在Java并发编程中都是用于实现同步机制的重要工具,但它们在使用方式、功能特性以及灵活性等方面存在一些显著的差异。 首先,从使用方式上来看,synchronized是Java语言内置的关键字,...
java基本教程之synchronized关键字java多线程教程共19页.pdf.zip
并发编程原理学习:synchronized关键字.doc
java synchronized关键字原理、自定义一把锁来实现同步等
Java多线程synchronized关键字详解(六)共5页.pdf.zip
线程安全,使用synchronized关键字
5-4JVM内置锁synchronized关键字详解.mp4
【ASP.NET编程知识】实例解析Java中的synchronized关键字与线程安全问题.docx
主要介绍了Java中synchronized关键字的用法,针对synchronized修饰方法的使用作出了简单讲解和演示,需要的朋友可以参考下
Java并发编程---synchronized关键
NULL 博文链接:https://seandsky-boyy-163-com.iteye.com/blog/1340783
开启了10个线程,每个线程都累加了10000000次,如果结果正确的话总数应该是10*10000000=1000000000.可是运行多次结果都不是这个数,而且每次运行结果都不一样。 线程安全问题主要来源于JMM的设计,主要集中在主内存...