synchronize实现同步锁的对比一:synchronize同步this代码块解与非静态方法同步是同一个锁的案例
2018-01-23 15:28
776 查看
synchronize同步this代码块解与非静态方法同步是同一个锁的。
说明:首先要证明synchronize同步this代码块解与非静态方法同步是同一个锁的。
我们可以通过一个标记来判断一部分数据被synchronize同步this代码块同步,另外一部分数据使用非静态方法同步。
如果出现有线程安全问题说明不是同一把锁,反之是同一把锁。
对比代码如下
代码一:会出现线程安全问题
package com.thread;
/**
* 抢票示例
* @author 11011844
*
*/
class ThreadTrainl implements Runnable {
//private Object obj =new Object();//特殊的instance变量
private byte[] lock = new byte[0]; // 特殊的instance变量
private int trainCount=100;//设置100张火车票
public boolean isLock=true;
public void run() {
//1.this块==非静态方法同步锁
//2.当前字节码文件==静态方法同步锁
if(isLock){
while(trainCount>0){
synchronized (lock) {
if(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
}else{
while(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sale();
}
}
}
private synchronized void sale() {//同步方法
if(trainCount>0){
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
public class SynchronizeMethoddDmeo {
public static void main(String[] args) {
ThreadTrainl threadTrain=new ThreadTrainl();//实例抢票:(多线程共享同一个全局变量,进行写的操作。)
Thread t1=new Thread(threadTrain,"窗口1");
Thread t2=new Thread(threadTrain,"窗口2");
t1.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
threadTrain.isLock=false;
t2.start();
}
}
代码二:不会出现线程问题
package com.thread;
/**
* 抢票示例
* @author 11011844
*
*/
class ThreadTrainl implements Runnable {
//private Object obj =new Object();//特殊的instance变量
private byte[] lock = new byte[0]; // 特殊的instance变量
private int trainCount=100;//设置100张火车票
public boolean isLock=true;
public void run() {
//1.this块==非静态方法同步锁
//2.当前字节码文件==静态方法同步锁
if(isLock){
while(trainCount>0){
synchronized (this) {
if(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
}else{
while(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sale();
}
}
}
private synchronized void sale() {//同步方法
if(trainCount>0){
S
4000
ystem.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
public class SynchronizeMethoddDmeo {
public static void main(String[] args) {
ThreadTrainl threadTrain=new ThreadTrainl();//实例抢票:(多线程共享同一个全局变量,进行写的操作。)
Thread t1=new Thread(threadTrain,"窗口1");
Thread t2=new Thread(threadTrain,"窗口2");
t1.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
threadTrain.isLock=false;
t2.start();
}
}
说明:首先要证明synchronize同步this代码块解与非静态方法同步是同一个锁的。
我们可以通过一个标记来判断一部分数据被synchronize同步this代码块同步,另外一部分数据使用非静态方法同步。
如果出现有线程安全问题说明不是同一把锁,反之是同一把锁。
对比代码如下
代码一:会出现线程安全问题
package com.thread;
/**
* 抢票示例
* @author 11011844
*
*/
class ThreadTrainl implements Runnable {
//private Object obj =new Object();//特殊的instance变量
private byte[] lock = new byte[0]; // 特殊的instance变量
private int trainCount=100;//设置100张火车票
public boolean isLock=true;
public void run() {
//1.this块==非静态方法同步锁
//2.当前字节码文件==静态方法同步锁
if(isLock){
while(trainCount>0){
synchronized (lock) {
if(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
}else{
while(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sale();
}
}
}
private synchronized void sale() {//同步方法
if(trainCount>0){
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
public class SynchronizeMethoddDmeo {
public static void main(String[] args) {
ThreadTrainl threadTrain=new ThreadTrainl();//实例抢票:(多线程共享同一个全局变量,进行写的操作。)
Thread t1=new Thread(threadTrain,"窗口1");
Thread t2=new Thread(threadTrain,"窗口2");
t1.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
threadTrain.isLock=false;
t2.start();
}
}
代码二:不会出现线程问题
package com.thread;
/**
* 抢票示例
* @author 11011844
*
*/
class ThreadTrainl implements Runnable {
//private Object obj =new Object();//特殊的instance变量
private byte[] lock = new byte[0]; // 特殊的instance变量
private int trainCount=100;//设置100张火车票
public boolean isLock=true;
public void run() {
//1.this块==非静态方法同步锁
//2.当前字节码文件==静态方法同步锁
if(isLock){
while(trainCount>0){
synchronized (this) {
if(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
}else{
while(trainCount>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sale();
}
}
}
private synchronized void sale() {//同步方法
if(trainCount>0){
S
4000
ystem.out.println(Thread.currentThread().getName()+",出售第"+(100-trainCount+1)+"票");
trainCount--;
}
}
}
public class SynchronizeMethoddDmeo {
public static void main(String[] args) {
ThreadTrainl threadTrain=new ThreadTrainl();//实例抢票:(多线程共享同一个全局变量,进行写的操作。)
Thread t1=new Thread(threadTrain,"窗口1");
Thread t2=new Thread(threadTrain,"窗口2");
t1.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
threadTrain.isLock=false;
t2.start();
}
}
相关文章推荐
- synchronize实现同步锁的对比二:当前字节码文件代码块的lock与静态代码块同步锁对比
- C#--第九周 任务3--定义一个静态成员方法,使用Random实现从一组数中随机抽取n个不重复的数
- Java中有几种方法实现一个线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不提倡使用?
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?
- java开发线程篇1:java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
- C#--第九周实验--任务2--定义一个静态成员方法,该方法实现字符串反转。
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- 总结面试中问到的一个问题构造函数、静态代码块、和调用的方法的加载顺序
- 一个非常有用的关于集合的例子,实现集合的add,remove和this[index]方法
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java 有几程方法可以实现一个线程?用什么关键字修饰同步?stop()和suspend()为什么不推荐使用?
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- 创建一个静态方法,给它传入一个对象,请循环的打印出该对象所在类的类名和所实现的方法名(华为笔试)
- 协议集每一个子协议的实现都要分别建立一个同步块(synchronize)
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- C#--第九周实验--任务3--定义一个静态成员方法,使用Random实现从一组数中随机抽取n个不重复的数。
- 一个对象数组的带参方法案例及思路实现
- C#--第九周 任务2--定义一个静态成员方法,该方法实现字符串反转
- java中有几种方法可以实现一个线程?用什么关键字修饰同步