三、线程同步之Sysnchronized关键字
线程同步
问题引入
public class Main {private static int amount = 0;public static void main(String[] args) {System.out.println(++amount);new MyThread("thread1").start();new MyThread("thread2").start();}private static void calc(String tag){++amount;try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(tag + "==>" + amount);}static class MyThread extends Thread {private String name;public MyThread(String name) {super();this.name = name;}@Overridepublic void run() {super.run();calc(name);}}}

Synchronized关键字
同步方法块
synchronized(obj){...//此处是同步代码块}
//对象锁private static Object obj = new Object();private static void calc(String tag) {//执行此代码必须持有此锁,没有锁只能等待此锁的使用线程释放锁synchronized (obj) {++amount;try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(tag + "==>" + amount);}}

同步方法
private synchronized static void calc(String tag) {// 执行此代码必须持有此锁,没有锁只能等待此锁的使用线程释放锁++amount;try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(tag + "==>" + amount);}

释放锁
- 使用synchronized关键字,必须等待当前线程执行完同步代码块或者同步方法,锁被释放。
- 遇到return、break终止了当前代码块或者同步方法,锁被释放。
- 遇到未处理的异常导致的崩溃,当前锁被释放。
- 线程调用wait方法,释被放锁。
- 程序调用Thread.sleep()、Thread.yield(),当前线程不会释放锁。
- 其他线程调用suspend方法,将此方法挂起,当前线程不会释放锁。同时应该避免使用suspend和resume方法控制线程。
访问权限总结
- 一个类中,有多个方法,当前线程持有某锁,其他线程无法访问此锁锁定的其他同步方法,但是可以访问其他非同步方法
- 一个类中有多个代码块或同步方法,当前线程持有某所,其他线程可以访问其他锁锁定的同步代码块
三、线程同步之Sysnchronized关键字的更多相关文章
- 多线程,线程同步,synchronized关键字的用法
一.什么是多线程 Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorSe ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- java笔记--关于线程同步(7种同步方式)
关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢-- 为何要使用同步? ...
- JAVA中线程同步的方法(7种)汇总
同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就 ...
- java 多线程总结篇3之——生命周期和线程同步
一.生命周期 线程的生命周期全在一张图中,理解此图是基本: 线程状态图 一.新建和就绪状态 当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Jav ...
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...
- java中线程同步的几种方法
1.使用synchronized关键字 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注: synchro ...
- java笔记--关于线程同步(5种同步方式)【转】
为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完 ...
随机推荐
- Collection集合的功能及总结
Collection集合是集合顶层接口,不能实例化 功能 1.添加功能 boolean add(Object obj):添加一个元素 boolean addAll(Collection c):添加一个 ...
- vue2.0---模板语法
***插值 #文本 数据绑定最常见的形式就是双大括号的形式: <div id="app">{{message}}</div> 只要绑定的属性message上 ...
- PHP 文件限速下载代码
php 文件限速下载代码 <?php include("DBDA.class.php"); $db = new DBDA(); $bs = $_SERVER["QU ...
- 强有力的Linux历史命令 你还记得几个
列出所有出现到的命令:(所有一下信息都可以通过man history得到,而且还更多) history:列出历史中执行过的命令(-c清除所有的命令历史) !N:执行编号为N的历史命令 !-N:执行倒数 ...
- DX系列之TreeList
参考资料: DevXpress控件: 第三篇: 将 父子 关系进行到底
- SQL Server触发器
一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...
- 我的页面定制CSS代码(SimpleGamboge皮肤)
我的页面定制CSS代码,针对博客园SimpleGamboge皮肤. 调整: 1.左上图片更换为自己的头像 2.扩大左侧栏宽度,缩小右侧主栏宽度宽度 3.扩大内容页面的评论区宽度,工具图标靠左 4.去广 ...
- javascript语言理解
1.使用jquery remove,无法remove自身标签; 使用标签
- int与CString互相转化
int num; CString str; //int转CString num=; str.Format(_T("%d"),num); //CString转int str=L&qu ...
- Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
http://www.cnblogs.com/zhongweiv/archive/2013/01/07/https.html 配置环境 了解HTTPS 配置CA证书服务器 新建示例网站并发布在IIS ...