多线程-线程安全

事务(Transaction)是数据库管理系统的概念。
事务具有四大基本特性:

1.原子性(Atomicity): 事务是一个原子操作单位,要么全部执行成功,要么全部失败回滚。即事务中的所有操作要么全部提交,要么全部回滚,不会出现部分操作成功,部分操作失败的情况。

2.一致性(Consistency): 事务执行前后,数据库从一个一致性状态转换到另一个一致性状态。事务的执行不会破坏数据库的完整性约束和业务规则,保证数据的正确性和一致性。

3.隔离性(Isolation): 事务的执行是相互隔离的,彼此互不干扰。多个事务并发执行时,每个事务看起来好像在独立地执行,不会产生互相干扰的效果。隔离级别可以根据需要选择,例如读未提交,读已提交,可重复读和串行化。

4.持久性(Durability): 一旦事务提交成功,其所做的修改将永久保存在数据库中,并且对于后续的事务和系统故障是可恢复的。即使发生系统崩溃或断电等异常情况,数据库也能够保持一致性,事务的结果不会丢失。

线程安全问题-数据不一致
  • 数据不一致(Data Inconsistency):当多个线程同时访问和修改共享数据时,如果没有合适的同步措施,会导致数据的不一致性。例如,一个线程正在读取一个变量的值,而另一个线程正在修改该变量的值,这就可能导致读取到的数值是不准确的。
  • public class ThreadDemo implements Runnable{
        @Override
        public void run(){
            for(int i = 0; i < 10000; i++){
                Main.num++;
            }
        }
    }
    class Main{
        static int num = 0;//静态变量的特性 在内存中只存在一份
        public static void main(String[] args) throws InterruptedException{
            Thread t1 = new Thread (new ThreadDemo ());
            Thread t2 = new Thread (new ThreadDemo ());
            Thread t3 = new Thread (new ThreadDemo ());
            t1.start ();
            t2.start ();
            t3.start ();
        // join 方法 : 等待当前线程执行完成再继续执行
            t1.join ();
            t2.join ();
            t3.join ();
            System.out.println (num);
        }
    }

如何解决

在线程中原子性:不可被打断的操作 CPU执行时一定会执行完成的操作

eg: int i=0; i++; i=i+1

保证原子操作: 可以用锁

  • ·锁的机制就是一个信号标识 0 1 ,当一个线程修改这个标志之后,其他线程就不会 操作这个变量了
  • 只有原线程将标识修改回无锁的状态后,其他线程才可以来访问操作这个变量
public class ThreadDemo implements Runnable{
    @Override
    public void run(){
        for(int i = 0; i < 10000; i++){
// 参数: 多个线程都可以看到的一个对象 监视器锁
            synchronized (Main.lockObj){// 给需要原子操作的代码上锁 执行完成就会解锁
                Main.num++;
            }
        }
    }
}
class Main{
    static int num = 0;//静态变量的特性 在内存中只存在一份
    static Object lockObj = new Object();
    public static void main(String[] args) throws InterruptedException{
        Thread t1 = new Thread (new ThreadDemo ());
        Thread t2 = new Thread (new ThreadDemo ());
        Thread t3 = new Thread (new ThreadDemo ());
        t1.start ();
        t2.start ();
        t3.start ();
// join 方法 : 等待当前线程执行完成再继续执行
        t1.join ();
        t2.join ();
        t3.join ();
        System.out.println (num);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值