synchronized之线程安全

 一、当两个并发线程访问同一个对象object中的

这个synchronized(this)同步代码块时,

一个时间内只能有一个线程得到执行。

另一个线程必须等待当前线程执行完

这个代码块以后才能执行该代码块。

@SuppressLint("SimpleDateFormat")
public class MainActivity extends Activity implements OnClickListener{
private Thread mThraed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mThraed = new Thread(mRunnable);
((Button)findViewById(R.id.button1)).setOnClickListener(this);
((Button)findViewById(R.id.button2)).setOnClickListener(this);
}
private Runnable mRunnable = new Runnable(){
@Override
public void run() {
/**
 * 线程安全
 * 对线程进行加锁处理
 * 线程内的数据处理完毕后,再开锁
 * */
synchronized(mHandler){
while(true){
if(mThraed == null){
break;
}
try{
Thread.sleep(1000);
mHandler.sendEmptyMessage(0x01);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
};
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 0x01:
refreshUI();
break;
default:
break;
}
}
};
private void refreshUI(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String date = sdf.format(new Date());
Log.v("result",date);
((TextView)findViewById(R.id.textView1)).setText(date);
}
@Override
public void onClick(View arg0) {
if(arg0.getId() == R.id.button1){
if(mThraed == null){
mThraed = new Thread(mRunnable);
mThraed.start();
}else{
mThraed = new Thread(mRunnable);
mThraed.start();
}
}
if(arg0.getId() == R.id.button2){
mThraed = null;
}
}
}
时间: 2024-10-12 10:37:09

synchronized之线程安全的相关文章

Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同步:synchronized 多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是加入同步后因为需要等待,所以效率相对低下. 如:一个苹果,自己一个人去咬怎么都不会出问题,但是

ConcurrentHashMap、synchronized与线程安全

最近做的项目中遇到一个问题:明明用了ConcurrentHashMap,可是始终线程不安全 除去项目中的业务逻辑,简化后的代码如下: public class Test40 { public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 10; i++) { System.out.println(test()); } } private static int test() thr

notify,wait,synchronized实现线程间通知

wait阻塞线程释放锁:notify使wait所在的线程被唤醒在次获得锁,并执行,但要等到notify所在的线程代码全部执行后! 示例代码如下: package com.vhbi.service.impl; import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList; import java.util.LinkedList; import java.util.List; import java.util.concurrent

Java 对象锁-synchronized()与线程的状态与生命周期

synchronized(someObject){ //对象锁 } 对象锁的使用说明: 1.对象锁的返还. 当synchronize()语句执行完成. 当synchronize()语句执行出现异常. 当线程调用了wait()方法. 2.使用对象锁保护的数据都必须是私有的. 3.对象锁具有可重入性. 一个线程在已经获得对象锁的情况下,可以再次请求获得对象锁. 4.线程的生命周期

多线程同步互斥实例——使用synchronized实现线程通信和互斥

线程互斥概念 线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 实现线程同步互斥的四种方式 临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用 互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似. 事件(Event):通过线程间触发事件实现同步互斥 信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理

Java多线程:线程同步与关键字synchronized

一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blog.csdn.net/huang_xw/article/details/73185613. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 参见实验2:http://blog.csdn.net/h

一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized

使用synchronized package com.pb.thread.demo5; /**使用synchronized * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行 * * @author Denny * */ public class Count { private int num = 0; private boolean flag = false; // 标识 //加法 public synchronized void add() { while (flag) { tr

26 多线程(六)——线程安全 synchronized

关键字synchronized可以写在方法和代码块中 写在普通方法中:锁住的对象时this 写在静态方法中:锁住的对象时class 写在代码块中 关于这个synchronized关键字 线程锁会造成性能下降 线程锁用在大的方法中,很影响性能 关于线程锁 除了使用synchronized关键字外,还可以使用另一种线程锁,本文没有收录方法 下面来看一个没有加线程锁的案例:3个线程抢票 package _20191205; /** * 线程不安全: * @author TEDU */ public c

java 线程通信

java 线程通信使用wait notify 配合synchronized 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态.当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 如下代码: public class ThreadTest { //声明一个线程可视化的list集合 public static List<String> lis